Android学习系列(20)--App数据格式之解析Json
JSON数据格式,在Android中被广泛运用于客户端和网络(或者说服务器)通信,非常有必要系统的了解学习。
恰逢本人最近对json做了一个简单的学习,特此总结一下,以飨各位。
为了文章简明清晰,尽量多列点,少废话。
参考文档:http://www.ietf.org/rfc/rfc4627.txt?number=4627
1.JSON解析
(1).解析Object之一:
1
|
|
解析方法:
1
2
|
JSONObject demoJson = new JSONObject(jsonString); String url = demoJson.getString( "url" ); |
(2).解析Object之二:
1
|
{ "name" : "android" , "name" : "iphone" } |
解析方法:
1
2
3
4
|
JSONObject demoJson = new JSONObject(jsonString); String name = demoJson.getString( "name" ); String version = demoJson.getString( "version" ); System.out.println( "name:" +name+ ",version:" +version); |
(3).解析Array之一:
1
|
{ "number" :[1,2,3]} |
解析方法:
1
2
3
4
5
6
|
JSONObject demoJson = new JSONObject(jsonString); JSONArray numberList = demoJson.getJSONArray( "number" ); for (int i=0; i<numberList.length(); i++){ //因为数组中的类型为int,所以为getInt,其他getString,getLong同用 System.out.println(numberList.getInt(i)); } |
(4).解析Array之二:
1
|
{ "number" :[[1],[2],[3]]} |
解析方法:
1
2
3
4
5
6
7
|
//嵌套数组遍历 JSONObject demoJson = new JSONObject(jsonString); JSONArray numberList = demoJson.getJSONArray( "number" ); for ( int i= 0 ; i<numberList.length(); i++){ //获取数组中的数组 System.out.println(numberList.getJSONArray(i).getInt( 0 )); } |
(5).解析Object和Array:
1
|
{ "mobile" :[{ "name" : "android" },{ "name" : "iphone" }]} |
解析方法:
1
2
3
4
5
|
JSONObject demoJson = new JSONObject(jsonString); JSONArray numberList = demoJson.getJSONArray( "mobile" ); for ( int i= 0 ; i<numberList.length(); i++){ System.out.println(numberList.getJSONObject(i).getString( "name" )); } |
所以,我们发现get后面接着的是你想要的得到的结果的类型:getType,这个对理解很有帮助。
(6).使用optType:
上面的例子,使用getType在碰到查找不到节点的时候,会抛出异常。
如果使用optType,找不到节点,则返回null或者默认值。
1
2
3
4
|
//无url节点,抛出异常 String url = demoJson.getString( "url" ); //无url节点,返回空,如果为基本类型,则返回默认值 String url = demoJson.optString( "url" ); |
(7).UTF-8的BOM头导致解析JSON异常的问题
到json文件保存为utf-8的时候,在windows平台下,会产生bom头"EF BB EF"字节在文本的最前面(需要用十六进制工具打开才能看的到)。
有两种解决方法:
a.使用UltraEdit打开json文件, 另存为的时候,选择格式UTF-8,无BOM头,如果还不行,在用记事本打开,另存为UTF-8下,多试几次就可以了。
b.使用代码处理,截取json主体内容:
1
2
|
String jsonString = getJsonString(); jsonString = jsonString.substring(jsonString.indexOf( "{" ),jsonString.lastIndexOf( "}" )+ 1 ); |
2.JSON必知
(1).JSON是一种轻量级的数据交换格式
(2).JSON基于两种数据结构:Object和Array。其中Object是“名称/值”对的集合。
(3).对象:大括号,每一组string-value结合以","分隔,string和value以冒号分隔。
(4).数组:
(5).string由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。
(6).value可以是双引号括起来的字符串(string)、数值(number)、true
、false
、 null
、对象(object)或者数组(array)。这些结构可以嵌套。
(7).空白可以加入到任何符号之间,包括空格,tab,回车,换行等。
(8).举例:
a.Object实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
{ "Image" : { "Width" : 800, "Height" : 600, "Title" : "View from 15th Floor" , "Thumbnail" : { "Height" : 125, "Width" : "100" }, "IDs" : [116, 943, 234, 38793] } } |
b.Array实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
[ { "precision" : "zip" , "Latitude" : 37.7668, "Longitude" : -122.3959, "Address" : "" , "City" : "SAN FRANCISCO" , "State" : "CA" , "Zip" : "94107" , "Country" : "US" }, { "precision" : "zip" , "Latitude" : 37.371991, "Longitude" : -122.026020, "Address" : "" , "City" : "SUNNYVALE" , "State" : "CA" , "Zip" : "94085" , "Country" : "US" } ] |
3.小结
很简单 ,很基础,积水方能成江,累砖才可筑楼。
Android学习系列(20)--App数据格式之解析Json的更多相关文章
- Android学习系列(7)--App轮询服务器消息
这篇文章是android开发人员的必备知识. 1.轮询服务器 一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务. 其中需要注意轮询的频率 ...
- Android学习系列(15)--App列表之游标ListView(索引ListView)
游标ListView,提供索引标签,使用户能够快速定位列表项. 也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧. 一看图啥都懂了: 1. ...
- Android学习系列(23)--App主界面实现
在上篇文章<Android学习系列(22)--App主界面比较>中我们浅略的分析了几个主界面布局,选了一个最大众化的经典布局.今天我们就这个经典布局,用代码具体的实现它. 1.预览图先看下 ...
- Android学习系列(17)--App列表之圆角ListView(续)
http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html 本来这篇文章想并到上篇Android学习系列(16)- ...
- Android学习系列(18)--App工程结构搭建
本文算是一篇漫谈,谈一谈关于Android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构. 关于android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的 ...
- Android学习系列(10)--App列表之拖拽ListView(上)
研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨. 鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. ...
- Android学习系列(3)--App自动更新之自定义进度视图和内部存储
友好的视觉感知和稳定的不出错表现,来自于我们追求美感和考虑的全面性,博客园从技术的角度,一直我都很欣赏.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 这 ...
- Android学习系列(37)--App调试内存泄露之Context篇(下)
接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...
- Android学习系列(11)--App列表之拖拽ListView(下)
接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果. 7.重写onTouchEvent()方法. 在这个方法中我们主要是处理 ...
随机推荐
- mvc权限,登陆,异常
public class FilterOfPer : ActionFilterAttribute { public override void OnActionExecutin ...
- DB天气app冲刺第十一天
今天是第十一天了.今天遇到了一个很麻烦的问题 就是程序好好的然后调试运行之后能够安装成功 但总是运行不了 一直闪退.最主要的问题是代码还没有问题,这是最让人揪心的一个问题了.因为有bug的话还可以改, ...
- 使用Docker解决同一服务器运行不同版本PHP方案。
前言: 最近公司有两个站点,分别是两种系统进行二次开发,基于LNMP架构的网站.一般想PHP这种非编译型语言想要对外出售源码都会进行加密,加密方法有很多种,大部分都是使用Zend Guard来进行加密 ...
- PHP发送微信模版消息
public function payResult($params) { global $_GPC, $_W; $weid = $this->_weid; $order = pdo_fetch( ...
- MSMQ(消息队列)
前段时间研究WCF接触到了MSMQ,所以认真的学习了一下,下面是我的笔记. 我理解的MSMQ MSMQ可以被看成一个数据储存装置,就如同数据库,只不过数据存储的是一条一条的记录,而MSMQ存储的是一个 ...
- 配置单节点伪分布式Hadoop
先写的这一篇,很多东西没再重复写. 一.所需软件 jdk和ubuntu都是32位的. 二.安装JDK 1.建jdk文件夹 cd usr sudo mkdir javajdk 2.移动mv或者复制cp安 ...
- 10 things you should know about NoSQL databases
For a quarter of a century, the relational database (RDBMS) has been the dominant model for database ...
- Nagios+msn+fetion自定义时间发送报警消息
转自http://blog.csdn.net/deccmtd/article/details/6063467 Nagios+fetion发送手机报警使用了几个月.每次报警短信来都要看下手机.感觉麻烦. ...
- ECNU1101-Dinic
题意:从起点到终点有几条特殊路径. 特殊路径指的是:对于任意两条路径,他们的与起点相连的点是不同的点 && 与终点的相连的点是不同的点. /* 题意:从起点到终点有几条特殊路径. 特殊 ...
- javascript数据变量类型判断(JS变量是否是数组,是否是函数的判断)
function isArray(o) { return Object.prototype.toString.apply(o) === “[object Array]”;}function isFun ...