阶段一:解析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 ...
随机推荐
- Java的异步HttpClient
上篇提到了高性能处理的关键是异步,而我们当中许多人依旧在使用同步模式的HttpClient访问第三方Web资源,我认为原因之一是:异步的HttpClient诞生较晚,许多人不知道:另外也可能是大多数W ...
- [转]keil使用详解
第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易用.用过 ...
- 深入MySQL索引
MySQL索引作为数据库优化的常用手段之一在项目优化中经常会被用到, 但是如何建立高效索引,有效的使用索引以及索引优化的背后到底是什么原理?这次我们深入数据库索引,从索引的数据结构开始说起. 索引原理 ...
- 根据xml文件名获取xml数据并转化为实体。
1.定义一个xml文件. <?xml version="1.0" encoding="utf-8" ?> <UserManager xmlns ...
- 精通Perl(第2版)
精通Perl(第2版)(通往Perl大师之路必读经典书籍,体现了一种编程思维,能够帮你解决很多实际的问题) [美]brian d foy(布瑞恩·D·福瓦)著 王兴宇 刘宸宇 译 ISBN 978 ...
- WCF学习之旅—第三个示例之二(二十八)
上接WCF学习之旅—第三个示例之一(二十七) 五.在项目BookMgr.Model创建实体类数据 第一步,安装Entity Framework 1) 使用NuGet下载最新版的Entity Fram ...
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(16)-权限管理系统-漂亮的验证码
系列目录 我们上一节建了数据库的表,但我发现很多东西还未完善起来,比如验证码,我们先做好验证码吧,验证码我们再熟悉不过了,为了防止恶意的登录,我们必须在登录页面加入验证码,下面我将分享一个验证码,这个 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(41)-组织架构
系列目录 本节开始我们要实现工作流,此工作流可以和之前的所有章节脱离关系,也可以紧密合并. 我们当初设计的项目解决方案就是可伸缩可以拆离,可共享的项目解决方案.所以我们同时要添加App.Flow文件夹 ...
- Android消息传递之组件间传递消息
前言: 上篇学习总结了Android通过Handler消息机制实现了工作线程与UI线程之间的通信,今天来学习一下如何实现组件之间的通信.本文依然是为学习EventBus做铺垫,有对比才能进步,今天主要 ...
- 【项目记录】-液化气配送app android版
15年底参与过甲方呼叫中心平台开发.液化气配送app android版要求1个月开发完成.开发此项目以前我只有过一周android的开发经验.(与甲方签署过保密协议,遵循职业道德有些敏感信息不能写.) ...