Gson解析json
1、JSON
json数据不用再多说了,轻量级的数据传输交换。普遍应用于移动端和服务端的数据获取。比XML解析速度更快速,更省电。在Android中可以借助JSONObject和JSONArray解析json数据,还可以借助第三方工具快速解析如谷歌的GSON、阿里巴巴的fastjson。
2、基本用法
2.1、依赖
首先,使用Gson要在build.gradle中配置依赖:
dependencies {
implementation 'com.google.code.gson:gson:2.8.6'
}2.2、fromJson
创建JavaBean类,配合GSON解析数据。举个例子,要解析如下的json串:
String jsonStr =
{
"name":Quibbler,
"age":96
};就需要在对应的JavaBean类中添加所需解析的字段,不需要添加setter和getter方法:
public class JsonBean {
private int age;
private String name;
}配合Json接解析json数据
//构造函数创建Gson对象
Gson gson = new Gson();
//借助GSONBuilder可以进行配置
Gson gson = new GsonBuilder().create();
JsonBean jsonBean = gson.fromJson(jsonStr, JsonBean .class);2.3、toJson
任何Object对象都可以转换成对应的Json数据,Gson对象调用toJson(Object src)方法即可返回String类型的Json结果:
String jsonStr= gson.toJson(object);3、使用技巧
3.1、Json字段别名
有时候会遇到json中的字段数字开头,或者较复杂写成JavaBean不太符合命名规范,可以使用@SerializedName创建字段别名,Gson会更具这个别名去解析JSON:
{
"1":10096,
"2":1881134
}要想解析上面的就不可能创建名为1的java变量,就要用到@SerializedName指定变量别名:
@SerializedName(value = "1")
private int age;
@SerializedName("2")
private double salary;还支持备用可选别名,alternate = {}
@SerializedName(value = "1", alternate = {"age", "ages"})
private int age;3.1、解析Json数组
解析JSON数组稍微复杂一些,不过步骤一样,一般JSON中的[]数组转成Java中的List<>对象。类型通过:
new TypeToken<List<?>>(){}.getType())
String json = [
"apple",
"pear",
"banana"];转换成List<String>对象,其它类型的对象数组也可以这样解析。
Gson gson = new Gson();
// 传入的java类型是new TypeToken<List<String>>(){}.getType()
List<String> fruitList = gson.fromJson(json, new TypeToken<List<String>>(){}.getType());还可以直接转换成String[]数组:
Gson gson2 = new Gson();
// 传入的java类型是String[].class
String[] fruits = gson2.fromJson(json2, String[].class);4、更复杂的JSON
实际上服务端传来的JSON数据没有那么简单,数千行很复杂。可以用插件一键根据Json帮助开发者生成Json对应的Bean类,参考《GsonFormat插件:一键生成Json bean》。
{
"result":{
"songs":Array[30],//此处折叠数千行
"songCount":332
},
"code":200
}越复杂的Json对应的JavaBean也就会更复杂。不需要解析全部字段 ,只解析需要的数据字段即可。万变不离其宗,无非就两种JsonObject和JsonArray。逐层分析Json数据,再按顺序写出来,JavaBean也不会太乱:
最外层的两个JsonObect:result和int类型的code
result对象里面有嵌套了:JsonArray数组songs和int类型的songCount
.... ....
public class MusicBean {
private int code;
private Result result;
private static class Result{
private List<Song> songs;
private int songCount;
}
private static class Song{
//... ...
}
}参考资料:
