Android学习系列(20)--App数据格式之解析Json

JSON数据格式,在Android中被广泛运用于客户端和网络(或者说服务器)通信,非常有必要系统的了解学习。
     恰逢本人最近对json做了一个简单的学习,特此总结一下,以飨各位。
     为了文章简明清晰,尽量多列点,少废话。
     参考文档:http://www.ietf.org/rfc/rfc4627.txt?number=4627

1.JSON解析
     (1).解析Object之一:


1

{"url":"http://www.cnblogs.com/qianxudetianxia"}

  解析方法:


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)、truefalse、 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": {

          "Url":    "http://www.example.com/image/481989943",

          "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.小结
      很简单 ,很基础,积水方能成江,累砖才可筑楼。

时间: 2024-11-10 14:02:50

Android学习系列(20)--App数据格式之解析Json的相关文章

Android学习系列(17)--App列表之圆角ListView(续)

http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html 本来这篇文章想并到上篇Android学习系列(16)--App列表之圆角ListView中的,但是若是如此就让大家错过一篇新的好的文章,着实可惜.上篇中我们使用shape,corners,gradient实现了一个渐变的圆角效果,但是在完文之后的实践中,我发现有时效果不甚满意,选中和放手的事件监听没有去正确的判断,然后渐变效果也比较单一,性能也觉得不是很快

Android学习系列(7)--App轮询服务器消息

这篇文章是android开发人员的必备知识. 1.轮询服务器     一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务.    其中需要注意轮询的频率设置,要在需求和性能中平衡. 2.独立进程     无论程序是否正在运行,我们都要能通知到客户,我们需要一个独立进程的后台服务.     我们需要一个独立进程的后台服务.     在AndroidManifest.xml中注册Service时,有一个android:process属性,如果这个属性以

Android学习系列(15)--App列表之游标ListView(索引ListView)

游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1.游标(Fast scroll thumb)      就是右边的那个拖动的方块,这个非常的简单: 1 2 3 4 5 <ListView     android:id="@+id/tweaked_list"     android:layout_width="fill_pa

Android学习系列(23)--App主界面实现

在上篇文章<Android学习系列(22)--App主界面比较>中我们浅略的分析了几个主界面布局,选了一个最大众化的经典布局.今天我们就这个经典布局,用代码具体的实现它. 1.预览图先看下最终的界面设计图:    上面顶部是一个9patch背景图片+标题文字:下面底部是5个tab标签,表示应用的5大模块.中间内容部分则是各个模块的具体内容,可以再分类,或者直接显示内容. 2.准备素材按照上篇文章的界面,我们需要事先提供两大方面的素材:顶部+底部.顶部的素材非常简单,最重要的是背景(9patch

[Android学习系列20]图形图像的一些事

参考: android图形系统详解一:Canvas android图形系统详解二:Drawables android图形系统详解三:形状Drawable和九宫格 android图形系统详解四:控制硬加速 android图形系统详解五:Android绘制模式 android图形系统详解六:View layer[Android学习系列20]图形图像的一些事,码迷,mamicode.com

Android学习系列(28)--App集成支付宝[已过期]

手机的在线支付,被认为是2012年最看好的功能,我个人认为这也是移动互联网较传统互联网将会大放光彩的一个功能.人人有手机,人人携带手机,花钱买东西,不再需要取钱付现,不再需要回家上网银,想买什么,扫描一下,或者搜索一下,然后下单,不找零,直接送到你家,这将是手机支付给我们带来的全新交易体验.谷歌刚推出了谷歌钱包,这必是我们后面要使用的主要手段,但是鉴于当前国情,我觉得有必要介绍一下android手机集成支付宝功能. 1.下载官方架包和说明文档其实官方已经提供了安装指南,下载地址:https://

[转] Android学习系列(29)--App调试的几个命令实践

在Android的应用开发中,我们会用到各种代码调试:其实在Android的开发之后,我们可能会碰到一些随机的问题,如cpu过高,内存泄露等,我们无法简单的进行代码调试,我们需要一个系统日志等等,下面我把握工作中碰到的几个常用命令和方法给大家演示实践一下. 1.logcat命令这个命令最简单常用,可查看帮助,我不多说,如果需要打印时间,加参数-v time 1 adb logcat -v time 2.bugreport命令这个命令也非常简单,但是在实际应用中非常有用,会有从开机之后详细的dum

Android学习系列--App工程结构搭建

本文算是一篇漫谈,谈一谈关于android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构.      关于android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的角度,看到整齐的代码,优美的分层总是一种舒服的享受的.      从艺术的角度看,其实我们是在追求一种美. 本文先分析几个当今比较流行的android软件包,最后我们汲取其中觉得优秀的部分,搭建我们自己的通用android工程模板.      1. 微盘      2. 久忆日记      3.网易新

【转】Android学习系列(1)--为App签名(为apk签名)

原文网址:http://www.cnblogs.com/qianxudetianxia/archive/2011/04/09/2010468.html Android学习系列(1)--为App签名(为apk签名) 写博客是一种快乐,前提是你有所写,与人分享,是另一种快乐,前提是你有舞台展示,博客园就是这样的舞台.这篇文章是android开发人员的必备知识,是我特别为大家整理和总结的,不求完美,但是有用. 1.签名的意义 为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Pack