使用 Gson 解析 Json
1、什么是 Json
Json 是 JavaScript Object Natation 的缩写, 是用来描述数据结构, 它是基于纯文本的数据格式 。 服务器和客户端直接的数据交互通常是用 Json 完成。
2、什么是 Gson
Gson 是 google 提供用来解析 Json 的一个开源框架 , 同类的框架 fastJson , JackJson等等。因为用 Android 提供的原生方法来完成 Json 解析过程比较繁琐 , 所以利用三方开源库来解析 Json 是一个不错的选择。
3、Json 格式
Json 存储数据的主要形式是键值对 key - value 。Json 的格式主要有以下几个需要注意的地方。
- key 的取值为String 类型 ; 那么value的取值类型可以为:String , int , boolean , Object , null;
- Json 数据一般是包含在大括号 { } 和中括号 [ ] 中的 , 中括号主要是用在数组类型。
如:
普通类型
{
" name ": "Tom",
" age " : 13,
" student " : ture
}
数组类型
[
{
" name ": "Tom",
" age " : 13,
" student " : ture
},
{
" name ": "Tom2",
" age " : 13,
" student " : false
}
]
4、Gson 的使用
- 引入 Gson ,Gson的引入和其他第三方库的引入基本上一样,这里就不介绍了。
- Gson 的格式化和解析。这是 Gson 的两个主要操作,分别相当于 序列化 和 反序列化。也就是说,格式化即:将 Java 对象转化为 Json 字符串; 解析即 : 将 Json 字符串 转化为 Java 对象。
Gson格式化
我们这里主要是讲 Gson 解析,所以对于Gson 格式化我们这就简单的举个例子。
创建 Java 对象。
Man man = new Man(); man.setName("zhangsan"); man.setAge("12");
格式化
Gson gson = new Gson(); //转化为Json字符串 String json = gson.toJson(man);
Gson 解析
Gson 解析的节点主要分为 4 个类型(这里的分类不同的开发者有不同的理解,这里笔者分为 4 种):
- JsonPrimitive : 这里主要是一些基本的数据类型 , 如int 、String 和 Boolean 等等。
- JsonNull : 这代表空节点 。
- JsonObject : 这代表节点是对象类型 。
- JsonArray : 这代表节点是数组类型。
其中 JsonPrimitive 、JsonObject 和 JsonArry 类型的节点使用的比较多。
注意:Gson 的解析大致可以分为两种。No1: Json字符串中的所有属性都解析成 Java 对象 。 No2: Json字符串中的部分属性解析成 Java 对象实际场景中后台的一个接口可能是提供给多个模块共同使用,各个模块可能只需要接口传过来 Json 字符串中的部分参数。
完全解析
转化为Object
Gson mGson = new Gson(); Man man = mGson.fromJson(json, Man.class);//json 为 Json 字符串
转化为List
Gson mGson = new Gson(); List<Man> mans = mGson.fromJson(json, new TypeToken<List<Man>>(){}.getType());
TypeToken 是 Gson 为我们提供了用来实现对泛型的支持的。
部分解析
现有如下的一个 Json 字符串,需要对它进行 Json 解析。
[{"title":"既然已经分手了,所以做人就应该干脆点,你们说是吗?",
"thumburl":"http://ww3.sinaimg.cn/large/e4e2bea6ly1feapqivtnpj20c80i9q3i.jpg",
"sourceurl":"http://down.laifudao.com/images/tupian/2017328192430.jpg","height":"657","width":"440","class":"1","url":"http://www.laifudao.com/tupian/68166.htm"},
{"title":"WC时候看到的,当时感觉压力很大",
"thumburl":"http://ww2.sinaimg.cn/large/bd698b0fjw1efacmj4w78j20dr0dy751.jpg",
"sourceurl":"http://down.laifudao.com/images/tupian/20144100126.jpg","height":"502","width":"495","class":"1","url":"http://www.laifudao.com/tupian/31668.htm"}]
使用 HiJson工具解析的结构如下图,
解析步骤
1.定义JavaBean
public class ImageBean {
private String title;
private String thumburl;
private String sourceurl;
private int height;
private int width;
private String classX;
private String url;
}
PS : 为了节省篇幅这里将参数的 get 和 set 方法省略了。
有时候由于后台工程师和前台工程师编码时的命名习惯不同,需要对一些参数的名字进行修改。如:后台工程师提供的 Json 字符串中的参数名为 sourceurl; 根据前台工程师的习惯想把这个参数名改为 sourceUrl (即在JavaBean 中使用sourceUrl这个变量名)。那么为了使 Gson 可以正常的解析,那么需要在 JavaBean 中添加@SerializedName 注解。修改后的 JavaBean 如下:
public class ImageBean {
private String title;
private String thumburl;
@SerializedName("sourceurl")//添加注解
private String sourceUrl;****
private int height;
private int width;
private String classX;
private String url;
}
2.获得 “ 解析者 ” 。
List<ImageBean> beans = new ArrayList<ImageBean>();
//获得解析者
JsonParser parser = new JsonParser();
3.获得根节点以及得到跟节点的数据类型 。
//获得根节点元素
JsonElement jsonElement =parser.parse(res);
//得到 根节点为数组类型的节点对象
JsonArray jsonArray = jsonElement.getAsJsonArray();
4.取值。
for (int i = 1; i < jsonArray.size(); i++) {
//将数组中的第i个字符串值转化为JsonObject对象(因为第i 个元素是对象 数据类型)
JsonObject jo = jsonArray.get(i).getAsJsonObject();
ImageBean news = mGson.fromJson(jo, ImageBean.class);
beans.add(news);
}
这是笔者对Gson的一些简单用法的理解,要是存在有误的地方望提出,谢谢