1、JSON介绍

       JSON是一种数据结构比较简单,轻量级的,易于存储的数据结构形式。很方便人的阅读,也方便机器的编写和解析。

       JSON是一种完全独立于文本语言的文本结构,我们既可以在js代码中写json数据,也能在java、php等语言中使用这种文本形式。


2、JSON结构分析

       JSON只有两种数据结构模型:数组和对象。数组常用的表示是JSONArray,对象常用的表示是JSONObject。

       JSON的存储结构采用的是键值对的形式表现的,熟悉JAVA开发的人应该很清楚,是实际上是map的存储方式,一个key对应一个value。当然,在不同语言中,可能理解方式上会有不同的差异,的数据结构中可能被理解为数据字典,C中可能被理解为结构体等数据类型。关于这个,等下我们会举例说明。


3、JSON数据举例

       可能有的人对json数据形式并不熟悉,这里给出一个json数据的示例,这是从一段代码中截取出来的内容,可能大家看起来会觉得很奇怪,但是这是一个完整的json格式的字符串,包括了json定义的两中数据格式,数组和对象:

{
"id": "20150104A000SB00",
"thumbnails_qqnews": [
"http://inews.gtimg.com/newsapp_ls/0/34260782_150110/0"
],
"thumbnails": [
"http://inews.gtimg.com/newsapp_ls/0/34260782_150110/0"
],
"articletype": "0",
"timestamp": 1420373100,
"time": "2015-01-04 20:05:00",
"commentid": "1074737367",
"url": "http://view.inews.qq.com/a/20150104A000SB00",
"title": "武媚娘传奇→武大头传奇",
"tag": [ ],
"abstract": "男人在年轻的时候都希望能拥有一个花枝招展,外表光鲜亮丽的那种女人。可是随着岁月的沉淀,尤其是当他有了自己的一番事业和丰富的人生阅历时,就会发现自己当初的想法是多么幼稚,因为,一个根本就不够!",
"author": [ ],
"chlid": "1796",
"origUrl": "http://m.pengfu.com/content/1127642/",
"show_expr": 1,
"flag": "0",
"picShowType": 0,
"chlname": "捧腹网",
"chlmrk": "精选搞笑图片,无节操、有内涵、巨邪恶、神回复,看点多,笑点多!",
"chlsicon": "http://pnewsapp.tc.qq.com/newsapp_ls/0/om_407743_100100/0",
"chlicon": "http://pnewsapp.tc.qq.com/newsapp_ls/0/om_407743_100100/0",
"source": "捧腹网",
"wechat": "pengfuwang001",
"PlacementId": "9079537218569440795",
"SubAdOn": 0,
"commentPlacementId": "",
"openAdsComment": 0
}



4、解析方式

       在不同的语言中,可能有不同的解析方式,这里我们只讨论在Android环境中的解析方式,与java中是一致的。

       前面我们说过,JSON是采用的map集合形式的封装,是键值对的形式,那么我们在取出数据的时候,就会采用get方法,如下两句代码:

JSONObject jsonObject = new JSONObject(jsonString);
JSONObject msgJsonObject = jsonObject.getJSONObject("msg");

这两句代码的意思是说,我们将获得的json字符串,实例化成为一个json对象,然后在这个json对象中,获取得到msg这个对象。

JSONArray temp = product.getJSONArray("photos");
int length = temp.length();
for (int i = 0; i < length; i++) {
	String msg = temp.optString(i);
	imgList.add(msg);
}

这段代码的意思是从product这个json对象中,获得一个名为photos的json数组对象,然后将之存储在一个集合中。

product.getString("title")

这一句代码就比较简单容易理解了,意思是获取一个title的对象,而这个对象是一个String类型的对象。


5、总结

        在上面的json解析中,我们只是简单的抽取了一些比较重要的代码片段,并没有完整的展示如何解析一段代码,这里有两个问题需要注意:

(1)、在处理json字符串的时候,需要处理一个异常,名为JSONException,通常是json的数据格式不对或者数据不完整。

(2)、在获取json字符串中的值的时候,如果试用get获取,可能会出现该字符串不存在而导致报错的情况,可以试用opt获取,代码如下:

product.optString("title")

但是这里会出现一个问题,那就是如果没有title这个字符串对象,这句话也是不会报错的,但是程序的执行结果却不是我们预期那样的。