Android系列学习之JSON解析
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。 易于人阅读和编写。同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使JSON成为理想的数据交换语言。
JSON建构于两种结构:
1.“名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
2.值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。
JSON具有以下这些形式:
对象是一个无序的“‘名称/值’对”集合。一个对象以“{”(左括号)开始,“}”(右括号)结束。每个“名称”后跟一个“:”(冒号);“‘名称/值’ 对”之间使用“,”(逗号)分隔;值可以使各种基本数据类型,对象、数组等。
下面学习一下我们怎么去解析一个JSON数据:以解析豆瓣网的一本书的简介为例:http://api.douban.com/v2/book/1220562
利用Android本身自带的org.json.JSONObject解析该数据下的部分数据。
(只解析部分数据)
JSONObject jsonObject = new JSONObject(value);
//获取相应的数据类型,后面的字符串为需要获取的数据的键
//获取字符串
String summary = jsonObject.getString("summary");
Log.e("gaosi", "summary=" + summary);
//获取JSON对象
JSONObject images = jsonObject.getJSONObject("images");
//从images的JSON 对象当中在解析
String small = images.getString("small");
Log.e("gaosi", "small=" + small);
//从JSON对象当中解析出JSON数组
JSONArray tags = jsonObject.getJSONArray("tags");
for (int i = 0; i < tags.length(); i++) {
//从JSON数组当中取出JSON对象
JSONObject tag = (JSONObject) tags.get(i);
//从取出的对象当中,解析整形数据
int count = tag.getInt("count");
//从取出的对象中解析字符串
String name = tag.getString("name");
Log.e("gaosi", "count=" + count);
Log.e("gaosi", "name=" + name);
}
解析数据结果:
下面比较一下GSON:GSON是谷歌攻城狮开发的一个开源库。
在使用GSON数据解析JSON数据感觉会比Android系统自带的JSONObject解析来的更容易一些?
Gson gson = new Gson();
//Book为自定义的类,封装了部分JSON数据
//value是需要解析的json数据
Book book = gson.fromJson(value, Book.class);
就两行代码就可以解析出来了!是不是有的不敢相信了呢?
一个json对象视为一个Bean类,json对象的数据视为Bean的属性。
那么Bean对象Book有何乾坤呢?
Book类知识封装了部分JSON 数据,在Book的属性当中值得注意的是属性数据类型类型要与JSON相对应的数据类型一致,属性名要与相对应的JSON数据的键一致。属性名不一致会解析不出数据的。
public class Book {
//属性名必须与键保持一致
private String pubdate;
private String title;
private String summary;
private Images images;
private ArrayList<com.usc.lilin.jsontest.Tag> tags;
//以及复写他们的get set toString方法
}
解析出来的结果:
Fast-JSON :
Fjsonast_JSON :是由阿里巴巴攻城狮研发的JSON解析库。fastJSON是目前性能最好的解析库。
FastJson的使用与谷歌的GSON差不多。都是将解析的数据封装在一个bean对象当中解析出来。
还有一点与GSON解析有所不同的是:Fast JSON解析的bean对象一定的有默认的构造函数,否则会抛异常:com.alibaba.fastjson.JSONException: default constructor not found。而GSON解析则不一定需要默认的构造函数。
//JSON为阿里巴巴的JSON库
Book book = JSON.parseObject(value, Book.class);
就一行代码就解析出来了,是不是觉得比GSON还高级呢?
解析出来的数据也是跟上面的一样。
JSON数据的三种解析也就那么简单,那么怎么构建一个JSON 数据呢?
利用Android本身自带的org.json.JSONObject构建JSON 的数据:
构建json数据,首先得指明你构建的是JSON对象还是JSON数据;
jsonStringer.array();//构建JSON数组开始
jsonStringer.object();//开始构建JSON对象
在构建完JSON数组或者JSON对象都应该调用endObject()或者endArray()来结束构建。
JSONStringer jsonStringer = new JSONStringer();
jsonStringer.array();
jsonStringer.object().key("name").value("gaosi").key("id").value(12).endObject();
jsonStringer.object().key("name").value("usc").key("id").value(435).endObject();
jsonStringer.endArray();
使用FastJSON构建JSON数据
需要先将JSON数据封装到Bean对象当中
使用JSON.toJSON(object);//构建一个JSON对象
//返回JSON结构字符串
//默认是false即字符串没有格式化
//为true时候,JSON 字符串是格式化的字符串
JSON.toJSONString(object, true);
//封装Bean类数据
Book book = new Book();
Tag tag = new Tag(12,"tag1_name","tag1_title");
Images images = new Images("image_small","image_large","iamge_medium");
ArrayList<Tag> list = new ArrayList<>();
list.add(tag);
book.setTitle("book_title");
book.setSummary("book_summary");
book.setImages(images);
book.setpubdate("book_pubdate");
book.setTags(list);
//构建一个JSON数据的对象
Object toJSON = JSON.toJSON(book);
String toString = toJSON.toString();
//构建JSON数据字符串
//参数Boolean 为是否为格式化的JSON字符串
String toJSONString = JSON.toJSONString(book, true);
Log.e("gaosi",toString);
Log.e("gaosi",toJSONString);
当boolean 为false时候,字符串会是怎么样?
String toJSONString = JSON.toJSONString(book, false);
使用GSON解析库来封装数据
其实GSON的使用与FastJSON都大同小异的
Gson gson = new Gson();
String json = gson.toJson(book);
Log.e("gaosi",json);
数据的构建结果:
总结:
JSON是一种轻量级的数据交互格式,它比XML数据交互跟简单方便灵活。XML在格式上更有对象的特点,但是在交互中没有JSON方便好用。
Android系统自带的JSON解析库的 API中,不管是解析JSON数据还是构建JSON数据,都是一层一层的解析或者封装;
而FastJSON和GSON则是将数据封装在Bean对象当中解析或者构建,感觉会比使用Android系统自带的JSON解析库API更简单易用
选择哪种JSON解析库还是XML交互,这个得根据业务需求与个人爱好来决定,哪种更适合业务需求选择哪种