JSON
json(JavaScript Object Notation)是一种轻量级的数据交换格式,用于数据转换传输,通用于php,java,c++,c#,Python等编程语言数据交换.
易于人阅读和编写,同时也易于机器解析和生成.
基本结构:对象和数组
gson
它是谷歌提供的用来在java对象和json数组之间进行映射的java类库,可以将一个json字符串转成一个java对象,反之也可以。
- 快速,高效,代码量少,简洁
- 面向对象,数据传递和解析方便
gson使用
它的jar包网上可以下载到.
比如你的json数据是这样的:
{
"rating":{
"max":10,
"numRaters":354,
"average":"7.0",
"min":0
},
"tags":[
{
"count":141,
"name":"片山恭一",
"title":"片山恭一"
},
{
"count":67,
"name":"日本",
"title":"日本"
},
{
"count":64,
"name":"日本文学",
"title":"日本文学"
},
{
"count":7,
"name":"外国文学",
"title":"外国文学"
}
],
"image":"https://img3.doubanio.com\/mpic\/s1747553.jpg",
"binding":"平装",
"images":{
"small":"https://img3.doubanio.com\/spic\/s1747553.jpg",
"large":"https://img3.doubanio.com\/lpic\/s1747553.jpg",
"medium":"https://img3.doubanio.com\/mpic\/s1747553.jpg"
},
"alt":"https:\/\/book.douban.com\/subject\/1220562\/",
"id":"1220562",
"publisher":"青岛出版社",
"title":"满月之夜白鲸现",
"url":"https:\/\/api.douban.com\/v2\/book\/1220562",
"summary":"那一年,是听莫扎特、钓鲈鱼和家庭破裂的一年。说到家庭破裂,母亲怪自己当初没有找到好男人,父亲则认为当时是被狐狸精迷住了眼,失常的是母亲,但出问题的是父亲……。",
"price":"15.00元"
}
你需要新建一个实体类去对应他(解析部分,你需要的),对应类如下:
public class Book {
private String title;
private String publisher;
private String summary;
//对应jsonArray
private ArrayList<Tag> tags;
//对应jsonObject
private Rate rating;
@SerializedName("binding")
private String bind;
public Book() {
}
public Book(String title, String publisher, String summary, ArrayList<Tag> tags, String numRaters) {
this.title = title;
this.publisher = publisher;
this.summary = summary;
this.tags = tags;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getPublisher() {
return publisher;
}
public void setPublisher(String publisher) {
this.publisher = publisher;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
public ArrayList<Tag> getTags() {
return tags;
}
public void setTags(ArrayList<Tag> tags) {
this.tags = tags;
}
@Override
public String toString() {
return title + " " + publisher + " " + summary + " " + tags.size() + " " + bind + rating.numRaters;
}
//类名可以随便,但是对象名必须对应,或者看下面的注意
public static class Rate{
private String max;
private String numRaters;
private String average;
private String min;
}
//我试了一下,这里不写static也是可以的,当然不写成内部类也行的
public static class Tag {
private String count;
private String name;
private String title;
}
}
注意:
//当它返回的字段名和你的命名规则有冲突,可以采用这样序列化命名
@SerializedName("username")//json中命名
private String name;//你的实体类命名
然后解析的话,很简单.
String json = ".......";
Gson gson = new Gson();
//传入一般的类
//Book book = gson.fromJson(result,Book.class);
//传入泛型类必须这样用,很多重载..
Book book = gson.fromJson(json,new TypeToken<Book>(){}.getType());
//当然也可以反转,有好多重载
String json = gson.toJson(book);
fast-json
它是阿里巴巴推出的,是一个性能很好的java语言实现的json解析器和生成器,极快的性能.
- 快速fast
- 强大,无依赖
- 支持注解,支持全类型序列化
fast-json使用
添加依赖:
compile ‘com.alibaba:fastjson:1.2.21’
实体类和gson差不多,解析时候的代码:
//我发现如果不写get和set函数,gson可以解析成功,而fast-json是null.
Book book = JSON.parseObject(json,Book.class);
两个库的简单使用总结
gson的实体类可以写的’松散’点,就是比如不带get和set函数也可以,而fast-json必须带,不然解析失败,但是都说fast-json速度快一些..
解析成数组的话我觉得都可以啊.
//gson方法
Type type = new TypeToken<ArrayList<Book>>(){}.getType();
Gson gson = new Gson();
//这里的json是那个jsonArray数组,你可以自己简单解析一下.
ArrayList<Book> list = gson.fromJson(json,type);
//fast-json方法
ArrayList<Book> list1 = (ArrayList<Book>) JSON.parseArray(json,Book.class);