你的位置:首页 > 操作系统

[操作系统]阶段一:解析JSON


“阶段一”是指我第一次系统地学习Android开发。这主要是对我的学习过程作个记录。

 

最近学到解析JSON格式的网络数据,而作业也要求自己找一个天气预报的API地址,然后解析其中JSON格式的数据。可能是因为找的是免费的API地址,在百度APIStore里的,它那JSON返回示例的数据,跟我获取之后,打Log显示出来的有些差异,这只是吐槽一下哈。另外,推荐初学者到“聚合数据”这个网站看一下那里的示例代码,写得很规范,思路、注解都很清楚。

因为第一次做解析JSON,而且这个API的数据还蛮复杂,在解析、读取的时候,写着写着就蒙圈了。所以这次主要是分享一下,我是如何理解解析JSON的方法和怎样获取其中的数据,数据格式由简单到复杂。而其基本语法,可以查看百度百科,那里面讲得很详细。

以下分析,都是基于这个假设,请求的数据都转换为String类型,并保存在content变量中。

1、{"resultcode": "200", "reason": "查询成功!"}

这种情况最好理解,只要JSONObject response = new JSONObject(content)String result = response.getString("resultcode");而我是这么理解的,一对花括号{}就代表一个对象,所以response是这条数据的JSONObject,当实现这个对象之后,就当作这个花括号{}被去除掉了,这么想得话,对于理解复杂的数据时或有帮助。当“值”的位置(即冒号后面的字符串)没有任何括号时,就可以调用get方法来取值。

2、{"resultcode": "200", "reason": "查询成功!", "future": [ { "temperature": "28℃~36℃", "weather": "晴转多云" } ] }

而当“值”的位置有方括号[]时(跟数组类似),就要用上一级的对象调用getJSONArray("future"),这里就是response,当执行了这一步,也可以当作把方括号去掉。方括号[]里,每一对花括号{}也代表一个对象,它也有下标,也是从0开始。

所以取temperature的代码是:

JSONObject response = new JSONObject(content);// ==> "resultcode": "200", "reason": "查询成功!", "future": [ { "temperature": "28℃~36℃", "weather": "晴转多云" } ]

JSONArray future= response.getJSONArray("future");// ==> { "temperature": "28℃~36℃", "weather": "晴转多云" }

JSONObject futureObject= future.getJSONObject(0);// ==> "temperature": "28℃~36℃", "weather": "晴转多云" 

String temperature= futureObject.getString("temperature");

3、{ "resultcode": "200",

    "reason": "查询成功!",

    "today": { "city": "天津", "date_y": "2014年03月21日", "week": "星期五", "temperature": "8℃~20℃", "weather": "晴转霾",  "weather_id": {  "fa": "00",  "fb": "53" } },

    "future": [ { "temperature": "28℃~36℃", "weather": "晴转多云", "weather_id": { "fa": "00", "fb": "01" }, "wind": "南风3-4级", "week": "星期一", "date": "20140804" },

        { "temperature": "28℃~36℃", "weather": "晴转多云", "weather_id": { "fa": "00", "fb": "01" }, "wind": "东南风3-4级", "week": "星期二", "date": "20140805" }

        ]

  }

(1)读"today"里的"city"

JSONObject response = new JSONObject(content);// ==>同上

JSONObject today= reponse.getJSONObject("today");// ==> "city": "天津", "date_y": "2014年03月21日", "week": "星期五", "temperature": "8℃~20℃", "weather": "晴转霾",  "weather_id": {  "fa": "00",  "fb": "53" }

String city= today.getString("city");

(2)读"future"的第二个"temperature"的"weather_id"的"fa"

JSONObject response = new JSONObject(content);// ==>同上

JSONArray future= response.getJSONArray("future");

JSONObject futureObject= future.getJSONObject(1);// ==> "temperature": "28℃~36℃", "weather": "晴转多云", "weather_id": { "fa": "00", "fb": "01" }, "wind": "东南风3-4级", "week": "星期二", "date": "20140805"

JSONObject weather_id= futureObject.getJSONObject("weather_id");// ==> "fa": "00", "fb": "01"

String id= weather_id.getString("fa");

总结:对于解析JSON,我是把它理解成是一个不断去括号的过程。先找到你要获取的数据,然后从最外层开始,一层层的剥。有花括号{}的就getJSONObect(除最外层的,最外层的是new JSONObject,这也是第一步要做的),有方括号[]的就getJSONArray。直到“值”的位置没有任何括号时,就能读取数据了。。