阶段一:解析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。直到“值”的位置没有任何括号时,就能读取数据了。。
阶段一:解析JSON的更多相关文章
- 阶段一:通过网络请求,获得并解析JSON数据(天气应用)
“阶段一”是指我第一次系统地学习Android开发.这主要是对我的学习过程作个记录. 在上一篇阶段一:解析JSON中提到,最近在写一个很简单的天气预报应用.即使功能很简单,但我还是想把它做成一个相对完 ...
- Xamarin.Android下获取与解析JSON
一.新建项目 1.新建一个Android项目,并命名为为NetJsonList 2.右击引用,选择添加引用,引用System.Json.dll 二.同步请求 既然是跨平台,我们自然不能按照java下的 ...
- 使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON、.net 的json的序列化与反序列化(一)
在开发中,我非常喜欢动态语言和匿名对象带来的方便,JSON.NET具有动态序列化和反序列化任意JSON内容的能力,不必将它映射到具体的强类型对象,它可以处理不确定的类型(集合.字典.动态对象和匿名对象 ...
- C语言创建及解析Json的使用法则
参考原文:http://blog.csdn.net/xukai871105/article/details/33013455 JSON(JavaScriptObject Notation)是一种轻量级 ...
- 不一样的dynamic解析json 万能方法
写过javascript的人都知道js解析json 1:(JSON) 字符串转换为对象. var str = '{"name":"lsw","hobb ...
- C# 解析JSON的几种办法
欲成为海洋大师,必知晓海中每一滴水的真名. 刚开始只是想找一个转换JSON数组的方法,结果在MSDN翻到一大把. 搜索过程中免不了碰到一大堆名词:WCF => DataContract => ...
- eval解析JSON中的注意点
在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. 使用Function对象来进行返回解析. 使用eval函数来解析,并且使用jquery ...
- C#解析json文件的方法
C# 解析 json JSON(全称为JavaScript Object Notation) 是一种轻量级的数据交换格式.它是基于JavaScript语法标准的一个子集. JSON采用完全独立于语言的 ...
- WP8解析JSON格式(使用DataContractJsonSerializer类)(推荐)
DataContractJsonSerializer是.NET自带的类,在解析JSON格式的时候使用起来方便快捷,至于生成方面由于暂时没用到就没去看了.使用需要引用System.Runtime.Ser ...
随机推荐
- 警惕!高版本VS发布时预编译导致Mono中Razor找不到视图
早前一段时间,一位朋友在Q群里面找到我,说它按照<Linux.NET学习手记>的操作,把一个ASP.NET MVC 4.0的项目部署到Mono之后出现Razor无法找到视图的现象.当时费了 ...
- (转) [it-ebooks]电子书列表
[it-ebooks]电子书列表 [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Obj ...
- JavaScript继承的模拟实现
我们都知道,在JavaScript中只能模拟实现OO中的"类",也就意味着,在JavaScript中没有类的继承.我们也只能通过在原对象里添加或改写属性来模拟实现. 先定义一个父类 ...
- openresty 前端开发入门六之调试篇
大多数情况下,调试信息,都可以通过ngx.say打印出来,但是有的时候,我们希望打印调试日志,不影响到返回数据,所以系统打印到其它地方,比如日志文件,或者控制台 这里主要用到一个方法就是ngx.log ...
- 2016年8月ios面试问题总结
1.app分发方式 所谓分发方式简单点讲就是你的app都可以通过哪些途径给用户使用. a:个人或者公司的开发者账号 可以上传appStore,用户通过appStore下载. b:企业账号:打包分发. ...
- javascript中字符串的比较规则
弄清这个还是很重要的,在字符排序中很有用处 非空字符串 > 空字符串 从第一个字符的charCode开始比较,大的就大 所有的字符都相同,就比较长度,长的大 '0'>'' '2'>' ...
- JavaScript 函数节流和函数去抖应用场景辨析
概述 也是好久没更新 源码解读,看着房价蹭蹭暴涨,心里也是五味杂陈,对未来充满恐惧和迷茫 ...(敢问一句你们上岸了吗) 言归正传,今天要介绍的是 underscore 中两个重要的方法,函数节流和函 ...
- oracle操作符
Oracle中算术操作符(+)(-)(*)(/) 值得注意的是:/ 在oracle中就相当于显示中的除法 5/2 = 2.5 比较操作符: 其中等号可以换成其他运算符:(后面为该操作符的单条件查询样例 ...
- ViEmu 3.6.0 过期 解除30天限制的方法
下载:链接: http://pan.baidu.com/s/1c2HUuWw 密码: sak8 删除下面2个地方 HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{B9CDA4 ...
- 使用VS2015进行C++开发的6个主要原因
使用VS2015进行C++开发的6个主要原因 使用Visual Studio 2015进行C++开发 在今天的 Build 大会上,进行了“将你的 C++ 代码转移至 VS2015 的 6 个原因”的 ...