[toc]
# JSON
Javascript Object Notation (/'dʒeɪsən/) 是一種資料交換格式。
(Data Interchange Format)
(RFC 8259)
JSON中的各種資料類型:
```
array //[data1,data2,data3...]
string //"a string"
number //1, 0, -1.5 ...
boolean //true, false
null
object //無序的 ``key: value`` pairs, {"k1": v1,"k2": v2...}
```
JSON檔以json為副檔名。
JSON document本身為一個object組成
JSON 不存在註解
範例:
```json=
{
"name": "andy",
"age": 19,
"email": "contact@speedcubing.top",
"properties": {
"birthday": "2001-09-11",
"city": "Taipei"
}
}
```
# Gson
maven: com.google.code.gson
source: https://github.com/google/gson
Gson是一個Java的Library,
### 用途
- 把物件轉成JSON String。 (Serialization)
- 把JSON String轉成一個物件。 (Unserialization)
- 解析JSON
- ...
(皆無須更動原物件程式碼)
### Example
假設有個物件User
```java=
class User {
public String name;
public int age;
public String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
}
```
### 把物件轉成JSON String
```java=
User user = new User("Andy",19,"contact@speedcubing.top");
Gson gson = new Gson();
String json = gson.toJson(user);
System.out.println(json);
```
輸出結果:
```{"name":"andy","age":19,"email":"contact@speedcubing.top"}```
### 把JSON String轉成一個物件
```java=
String json = "{\"name\":\"Kevin\",\"age\":23,\"email\":\"kevin@idontknow.com\"}";
Gson gson = new Gson();
User user = gson.fromJson(json, User.class);
System.out.println("Name: " + user.name);
System.out.println("Age: " + user.age);
System.out.println("Email: " + user.email);
```
輸出結果:
```
Name: Kevin
Age: 23
Email: kevin@idontknow.com
```
### 解析JSON
可以解析一個JSON String, 或是一個Reader(IO)
常用物件:
JsonElement: 各種資料類型的父類, 有getAsString, getAsInt, getAsJsonObject..等等方法
JsonObject: 有JsonElemet get(String key)方法,可以取值
假設以下內容存於test.json
```json=
{
"name": "andy",
"age": 19,
"email": "contact@speedcubing.top",
"properties": {
"birthday": "2001-09-11",
"city": "Taipei"
}
}
```
從Reader test.json解析JSON內容
```java=
FileReader reader = new FileReader("test.json");
JsonElement e = JsonParser.parseReader(reader);
JsonObject object = e.getAsJsonObject();
String name = object.get("name").getAsString();
System.out.println(name);
JsonObject properties = object.get("properties").getAsJsonObject();
System.out.println(properties);
System.out.println(properties.get("city").getAsString());
```
題外話: 把上面的程式用Python寫:
~~Java真該死~~
```python=
import json
with open("test.json", "r") as file:
data = json.load(file)
name = data["name"]
print(name)
properties = data["properties"]
print(properties)
print(properties["city"])
```