阶段一:解析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 ...
随机推荐
- #ifndef
关于c的#ifndef条件编译: 1)最好把头文件的内容都放在#ifndef和#endif中 2)一般格式: #ifndef <标识> #define <标识> ...... ...
- useful Ansible commands
This article includes some useful Ansible commands. I will try to write blogs by English. You may wa ...
- 简单事件机制Java实现
一个很简单方便的事件处理方法. 使用效果 事件发布者: //定义事件 public static EventTrans<String> AuthFailed = new EventTran ...
- YY一下十年后的自己
ps:其实这篇文章的评论比文章本身更有意思,欢迎关注. 每到年底总是我最焦虑的时候,年龄越大情况越明显. 可能越长大越是对 时光的流逝 更有感触,有感触之后就会胡思乱想.所以随手开始写下这篇文章. 人 ...
- 自定义view(一)
最近在学习自定义view 一遍看一别学顺便记录一下 1.View的测量-------->onMeasure() 首先,当我们要画一个图形的时候,必须知道三个数据:位置,长度,宽度 才能确定 ...
- Failure to find xxx in xxx was cached in the local repository, resolution will not be reattempted until the update interval of nexus has elapsed or updates are forced @ xxx
问题: 在linux服务器上使用maven编译war时报错: 16:41:35 [FATAL] Non-resolvable parent POM for ***: Failure to find * ...
- javaScript语法总结
一:语法 JavaScript:一种基于对象和事件驱动得客户端脚本语言: 由下面三者组成: 1,ECMAScript(一种由Ecma国际(前身为欧洲计算机制造商协会,European Computer ...
- 版本控制工具比较-CVS,SVN,GIT
首先介绍几个版本控制软件相互比较的重要依据: a.版本库模型(Repository model):描述了多个源码版本库副本间的关系,有客户端/服务器和分布式两种模式.在客户端/服务器模式下,每一用户通 ...
- 计算机程序的思维逻辑 (33) - Joda-Time
Joda-Time上节介绍了JDK API中的日期和时间类,我们提到了JDK API的一些不足,并提到,实践中有一个广泛使用的日期和时间类库,Joda-Time,本节我们就来介绍Joda-Time.俗 ...
- JavaScript学习总结(二)——闭包、IIFE、apply、函数与对象
一.闭包(Closure) 1.1.闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9:方法:找到所有的div, ...