GSON的基础用法
GSON是google提供的java包,用来序列化和反序列化json对象的。
Gson提供了fromJson()
和toJson()
两个直接用于解析和生成的方法,前者实现反序列化,后者实现了序列化。同时每个方法都提供了重载方法,我常用的总共有5个。
Gson.toJson(Object); //序列化
Gson.fromJson(Reader,Class); //反序列化
Gson.fromJson(String,Class);
Gson.fromJson(Reader,Type);
Gson.fromJson(String,Type);
GSON的基本用法
我们了解了json的官方解析中,是使用:JSONObject来表示json对象,JSONArray来表现列表即数组。
GSON也提供了这样的基础用法,我们先来学习一下基础的用法,后面再学习高级的用法。
在GSON中:JsonObject表示对象,JsonArray表示数组,JsonParser表示解析器:将json字符串解析为JsonObject或者JsonArray。
PS:注意和Json官方解析中对象和数组的区别
json字符串解析为Json对象
本例子都是使用的:GSON的2.8.5版本
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.5</version>
</dependency>
String str = "{\"id\":1234545,\"name\":\"gakki\",\"birthday\":\"2019-12-14T22:35:11.468\"}";
JsonParser jsonParser = new JsonParser();
JsonElement jsonElement = jsonParser.parse(str);
JsonObject jsonObject = jsonElement.getAsJsonObject();
JsonElement element = jsonObject.get("id");
int id = element.getAsInt();
String name = jsonObject.get("name").getAsString();
String birthday = jsonObject.get("birthday").getAsString();
LocalDateTime localDateTime = LocalDateTime.parse(birthday);
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss");
String format = dateTimeFormatter.format(localDateTime);
System.out.println("id:" + id + "\t" + "name:" + name + "\t" + "birthday:" + format);
说明:
通过JsonParser解析后,得到的是:JsonElement对象。
然后,我们通过观察:根元素是对象还是数组,来决定 JsonElement是调用:getAsJsonObjec 还是:getAsJsonArray 。
我们这里是{}包裹的对象,因此使用 getAsJsonObjec 来获取对象元素。如果你使用:getAsJsonArray,会抛出异常:
Exception in thread "main" java.lang.IllegalStateException: Not a JSON Array: {"id":1234545,"name":"gakki","birthday":"2019-12-14T22:35:11.468"}
at com.google.gson.JsonElement.getAsJsonArray(JsonElement.java:107)
at com.liuzhuo.gson.GsonUtil.parseJsonStrToJsonObj(GsonUtil.java:27)
at com.liuzhuo.gson.GsonUtil.main(GsonUtil.java:45)
程序输出的结果:
id:1234545 name:gakki birthday:2019-12-14 22:35:11
PS: 通过使用:jsonObject的get方法得到的对象还是jsonElement对象,然后根据key对应的value类型,分别调用对应的 getAsInt 、getAsString 等方法。如果key本身不存的话,get方法返回的JsonElement对象是null,因此会出现空指针异常,所以需要确定key本身存在,或者使用之前进行判断。
json数组字符串解析为JSON数组对象
String str = "[{\"id\":123,\"name\":\"gakki\",\"birthday\":\"2019-6-11T22:35:11.468\"},{\"id\":456,\"name\":\"liuzhuo\",\"birthday\":\"2019-6-12T22:35:11.468\"}]";
JsonParser jsonParser = new JsonParser();
JsonArray jsonArray = jsonParser.parse(str).getAsJsonArray();
for (int i = 0; i < jsonArray.size(); i++) {
JsonObject jsonObject = jsonArray.get(i).getAsJsonObject();
int id = jsonObject.get("id").getAsInt();
String name = jsonObject.get("name").getAsString();
String birthday = jsonObject.get("birthday").getAsString();
System.out.println("id:" + id + "\t" + "name:" + name + "\t" + "birthday:" + birthday);
}
输出结果:
id:123 name:gakki birthday:2019-6-11T22:35:11.468
id:456 name:liuzhuo birthday:2019-6-12T22:35:11.468
手动创建Json对象
public static void createJsonObj() {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("id", 6666);
jsonObject.addProperty("name", "gakkij");
jsonObject.addProperty("age", 18);
System.out.println(jsonObject); //{"id":6666,"name":"gakkij","age":18}
}
PS: 如果后添加的 key 已经存在了,会覆盖之前的key的value值。
JsonObject 和 JsonArray 都是 JsonElement 的 子类。
- JsonObject 通过 get方法获取 JsonElement对象后,根据相应的类型调用 getAsXXX来获取对象。
- JsonObject 可以通过:getAsJsonObject(String name) 来直接获取 JsonObject对象。
- JsonObject 可以通过:getAsJsonArray(String name) 来直接获取 JsonArray对象。
手动创建Json数组对象
public static void createJsonArray() {
JsonObject jsonObject1 = new JsonObject();
jsonObject1.addProperty("id", 6666);
jsonObject1.addProperty("name", "gakkij");
jsonObject1.addProperty("age", 18);
JsonObject jsonObject2 = new JsonObject();
jsonObject2.addProperty("id", 8888);
jsonObject2.addProperty("name", "liuzhuo");
jsonObject2.addProperty("age", 20);
JsonArray jsonArray = new JsonArray();
jsonArray.add(jsonObject1);
jsonArray.add(jsonObject2);
System.out.println(jsonArray);
//[{"id":6666,"name":"gakkij","age":18},{"id":8888,"name":"liuzhuo","age":20}]
}
注意:不是 JsonArray只能添加 JsonObject,其他的基本类型都能添加的,只是一般我们都是添加JsonObject对象,业务上好处理
public static void createJsonArray() {
JsonObject jsonObject1 = new JsonObject();
jsonObject1.addProperty("id", 6666);
jsonObject1.addProperty("name", "gakkij");
jsonObject1.addProperty("age", 18);
JsonObject jsonObject2 = new JsonObject();
jsonObject2.addProperty("id", 8888);
jsonObject2.addProperty("name", "liuzhuo");
jsonObject2.addProperty("age", 20);
JsonArray jsonArray = new JsonArray();
jsonArray.add(jsonObject1);
jsonArray.add(jsonObject2);
//添加其他类型的数据
jsonArray.add(4355);
jsonArray.add("address");
jsonArray.add(true);
System.out.println(jsonArray);
//[{"id":6666,"name":"gakkij","age":18},{"id":8888,"name":"liuzhuo","age":20},4355,"address",true]
}
删除JsonObject中的某一个属性
public static void delJsonObjProperty() {
String str = "{\"id\":1234545,\"name\":\"gakki\",\"birthday\":\"2019-12-14T22:35:11.468\"}";
JsonElement parse = new JsonParser().parse(str);
JsonObject jsonObject = parse.getAsJsonObject();
System.out.println("删除之前:" + jsonObject);
String name = jsonObject.remove("name").getAsString();
System.out.println("删除:" + name + ",之后:" + jsonObject);
}
输出:
删除之前:{"id":1234545,"name":"gakki","birthday":"2019-12-14T22:35:11.468"}
删除:gakki,之后:{"id":1234545,"birthday":"2019-12-14T22:35:11.468"}
修改Json对象中的某一个属性
public static void updateJsonObjProperty() {
String str = "{\"id\":1234545,\"name\":\"gakki\",\"birthday\":\"2019-12-14T22:35:11.468\"}";
JsonElement parse = new JsonParser().parse(str);
JsonObject jsonObject = parse.getAsJsonObject();
System.out.println("修改name属性之前:" + jsonObject);
jsonObject.addProperty("name", "liuzhuo");
System.out.println("修改name属性之后:" + jsonObject);
}
PS: 修改属性其实就是和添加一样:使用 addProperty 方法,key存在就替换,不存在就添加。
获取Json对象中的某一个属性
public static void getJsonObjProperty() {
String str = "{\"id\":1234545,\"name\":\"gakki\",\"birthday\":\"2019-12-14T22:35:11.468\"}";
JsonElement parse = new JsonParser().parse(str);
JsonObject jsonObject = parse.getAsJsonObject();
if (jsonObject.has("name")) {
String name = jsonObject.get("name").getAsString();
System.out.println("name:" + name);
}
System.out.println(jsonObject.has("unknow"));
}
输出结果:
name:gakki
false
GSON 和 json官方的 JSONObject对象一样,可以使用has方法来判断是否存在:key。
但是,GSON没有官方的optXXX方法,当key不存在时,返回默认值或者返回指定的值。
创建复杂的Json对象
public static void createComplexPerson() {
/**
* 实际应用中:构建该json对象
* [{"id":123,"name":"gakki","age":18,"dog":{"dName":"小黄","color":"yellow"}},
* {"id":345,"name":"liuzhuo","age":20,"dog":{"dName":"小黑","color":"black"}}]
*/
// 首先分析:数组中有几个对象,两个。对象下是否还有子对象:dog
JsonObject dog1 = new JsonObject();
dog1.addProperty("dName", "小黄");
dog1.addProperty("color", "yellow");
JsonObject dog2 = new JsonObject();
dog2.addProperty("dName", "小黑");
dog2.addProperty("color", "black");
JsonObject person1 = new JsonObject();
person1.addProperty("id", 123);
person1.addProperty("name", "gakki");
JsonObject person2 = new JsonObject();
person2.addProperty("id", 123);
person2.addProperty("name", "gakki");
person1.add("dog", dog1);
person2.add("dog", dog2);
JsonArray jsonArray = new JsonArray();
jsonArray.add(person1);
jsonArray.add(person2);
System.out.println(jsonArray);
}
输出结果:
[{"id":123,"name":"gakki","dog":{"dName":"小黄","color":"yellow"}},{"id":123,"name":"gakki","dog":{"dName":"小黑","color":"black"}}]
Process finished with exit code 0
PS: JsonObject对象中添加基本的元素是通过:addProperty 来添加的,如果是添加复杂对象,例如:JsonObject 或 JsonArray 就是使用:add 方法来添加。
总结
GSON的基本使用方法:主要是使用:JsonParser对象、JsonObject对象、JsonArray对象。
- JsonObject 对应于json官方的:JSONObject
- JsonArray 对应于json官方的:JSONArray
- JsonParser对象解析json字符串后,得到是JsonElement对象,JsonObject的get,JsonArray的get都是得到JsonElement对象,JsonElement对象会有一系列的getAsXXX方法,例如:getAsInt , getAsString , getAsBoolean等。
- 当key不存在时,会返回null,所以需要使用 has 方法来判断是否存在该key
GSON没有json官方的 optXXX 方法,当key不存在时,返回默认值或指定的值。