JSON相关基础知识

JSON的定义:

一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。

JSON Vs XML:

  1.JSON和XML的数据可读性基本相同

  2.JSON和XML同样拥有丰富的解析手段

  3.JSON相对于XML来讲,数据的体积小

  4.JSON与JavaScript的交互更加方便

  5.JSON对数据的描述性比XML较差

  6.JSON的速度要远远快于XML

android2.3提供的json解析类 :

JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。它对外部(External:   应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{"JSON": "Hello, World"},最外被大括号包裹,其中的Key和Value被冒号":"分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之间是以逗号","分隔。Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object 。

JSONStringer:json文本构建类 ,根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于 格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。

JSONArray:它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:     [value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,     get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。

JSONTokener:json解析类

JSONException:json中用到的异常 
JSONObject, JSONArray来构建json文本

 1 // 假设现在要创建这样一个json文本
 2 //  {
 3 //      "phone" : ["12345678", "87654321"], // 数组
 4 //      "name" : "yuanzhifei89", // 字符串
 5 //      "age" : 100, // 数值
 6 //      "address" : { "country" : "china", "province" : "jiangsu" }, // 对象
 7 //      "married" : false // 布尔值
 8 //  }
 910 try {
11    // 首先最外层是{},是创建一个对象
12     JSONObject person = new JSONObject();
13     // 第一个键phone的值是数组,所以需要创建数组对象
14     JSONArray phone = new JSONArray();
15     phone.put("12345678").put("87654321");
16     person.put("phone", phone);
17 18     person.put("name", "yuanzhifei89");
19     person.put("age", 100);
20     // 键address的值是对象,所以又要创建一个对象
21     JSONObject address = new JSONObject();
22     address.put("country", "china");
23     address.put("province", "jiangsu");
24     person.put("address", address);
25     person.put("married", false);
26 } catch (JSONException ex) {
27    // 键为null或使用json不支持的数字格式(NaN, infinities)
28     throw new RuntimeException(ex);
29 }  

getType和optType api的使用getType可以将要获取的键的值转换为指定的类型,如果无法转换或没有值则抛出JSONException  optType也是将要获取的键的值转换为指定的类型,无法转换或没有值时返回用户提供或这默认提供的值。

 1 try {
 2     // 所有使用的对象都是用上面创建的对象
 3     // 将第一个电话号码转换为数值和将名字转换为数值
 4     phone.getLong(0);
 5     person.getLong("name"); // 会抛异常,因为名字无法转换为long
 6     phone.optLong(0); // 代码内置的默认值
 7     phone.optLong(0, 1000); // 用户提供的默认值
 8     person.optLong("name");
 9     person.optLong("name", 1000); // 不像上面那样抛异常,而是返回1000
10 } catch (JSONException ex) {
11     // 异常处理代码
12 } 

除了上面的两个类,还可以使用JSONStringer来构建json文本

 1 try {
 2     JSONStringer jsonText = new JSONStringer();
 3     // 首先是{,对象开始。object和endObject必须配对使用
 4     jsonText.object();
 5
 6     jsonText.key("phone");
 7     // 键phone的值是数组。array和endArray必须配对使用
 8     jsonText.array();
 9     jsonText.value("12345678").value("87654321");
10     jsonText.endArray();
11
12     jsonText.key("name");
13     jsonText.value("yuanzhifei89");
14     jsonText.key("age");
15     jsonText.value(100);
16
17     jsonText.key("address");
18     // 键address的值是对象
19     jsonText.object();
20     jsonText.key("country");
21     jsonText.value("china");
22     jsonText.key("province");
23     jsonText.value("jiangsu");
24     jsonText.endObject();
25
26     jsonText.key("married");
27     jsonText.value(false);
28
29     // },对象结束
30     jsonText.endObject();
31 } catch (JSONException ex) {
32     throw new RuntimeException(ex);
33 }  

json文本解析类JSONTokener  
按照RFC4627规范将json文本解析为相应的对象。

对于将json文本解析为对象,只需要用到该类的两个api:  
构造函数 
public Object nextValue();

 1 //  {
 2 //      "phone" : ["12345678", "87654321"], // 数组
 3 //      "name" : "yuanzhifei89", // 字符串
 4 //      "age" : 100, // 数值
 5 //      "address" : { "country" : "china", "province" : "jiangsu" }, // 对象
 6 //      "married" : false // 布尔值
 7 //  }
 8
 9 private static final String JSON =
10 "{" +
11     "   \"phone\" : [\"12345678\", \"87654321\"]," +
12     "   \"name\" : \"yuanzhifei89\"," +
13     "   \"age\" : 100," +
14     "   \"address\" : { \"country\" : \"china\", \"province\" : \"jiangsu\" }," +
15     "   \"married\" : false," +
16 "}";
17
18 try {
19     JSONTokener jsonParser = new JSONTokener(JSON);
20     // 此时还未读取任何json文本,直接读取就是一个JSONObject对象。
21     // 如果此时的读取位置在"name" : 了,那么nextValue就是"yuanzhifei89"(String)
22     JSONObject person = (JSONObject) jsonParser.nextValue();
23     // 接下来的就是JSON对象的操作了
24     person.getJSONArray("phone");
25     person.getString("name");
26     person.getInt("age");
27     person.getJSONObject("address");
28     person.getBoolean("married");
29 } catch (JSONException ex) {
30     // 异常处理代码
31 }   

其它的api基本就是用来查看json文本中的文本的

 1 try {
 2     JSONTokener jsonParser = new JSONTokener(JSON);
 3     // 继续向下读8个json文本中的字符。此时刚开始,即在{处
 4     jsonParser.next(8); //{    "phone。tab算一个字符
 5
 6     // 继续向下读1个json文本中的字符
 7     jsonParser.next(); //"
 8
 9     // 继续向下读取一个json文本中的字符。该字符不是空白、同时也不是注视中的字符
10     jsonParser.nextClean(); //:
11
12     // 返回当前的读取位置到第一次遇到‘a‘之间的字符串(不包括a)。
13     jsonParser.nextString(‘a‘); //  ["12345678", "87654321"],    "n(前面有两个空格)
14
15     // 返回当前读取位置到第一次遇到字符串中(如"0089")任意字符之间的字符串,同时该字符是trimmed的。(此处就是第一次遇到了89)
16     jsonParser.nextTo("0089"); //me" : "yuanzhifei
17
18     // 读取位置撤销一个
19     jsonParser.back();
20     jsonParser.next(); //i
21
22     // 读取位置前进到指定字符串处(包括字符串)
23     jsonParser.skipPast("address");
24     jsonParser.next(8); //" : { "c
25
26     // 读取位置前进到执行字符处(不包括字符)
27     jsonParser.skipTo(‘m‘);
28     jsonParser.next(8); //married"
29 } catch (JSONException ex) {
30     // 异常处理代码
31 }

【附】原文请见:http://www.cnblogs.com/jianrong-zheng/archive/2013/07/26/3217228.html

时间: 2024-10-12 19:57:26

JSON相关基础知识的相关文章

网络连接相关基础知识笔记

一.常说的TCP/IP的含义 TCP/IP协议簇并不仅仅指TCP协议和IP协议,实际它包括了一系列协议组成的集合,如:TCP,IP,UDP,FTP,SMTP,DNS,ARP,PPP等 TCP与UDP协议都属于传输层协议,但有很大不同,TCP是面向连接的协议,提供的是可靠的数据流服务,TCP采用"带重传的肯定确认"机制来实现传输的可靠性,实现了一种"虚电路",因为从物理上来说,并不是真正在两台主机间建立了连接,这种连接只是存在于逻辑上的.最大的开销出现在通信前建立连接

深入理解mysql之BDB系列(1)---BDB相关基础知识

    深入理解mysql之BDB系列(1) ---BDB相关基础知识 作者:杨万富 一:BDB体系结构 1.1.BDB体系结构 BDB总体的体系结构如图1.1所看到的,包括五个子系统(见图1.1中相关数).1)数据存取子系统,2)事务子系统,3)锁子系统,4)内存池管理子系统,5)日志子系统. 在一个应用程序中,并不一定须要全然具备这5大子系统. 假设程序仅仅使用了数据存取子系统,它的体系结构如图1.2.在图1.2中,我们仅仅使了两个子系统:数据存取以及内存池子系统.(备注:另外三个子系统在B

Json数组基础知识

1.对象是一个无序的"'名称/值'对"集合. (1)一个对象以"{"(左括号)开始,"}"(右括号)结束. (2)每个"名称"后跟一个":"(冒号): (3)"'名称/值' 对"之间使用","(逗号)分隔.(如图所示,图中表示数据的方式是类似非确定性自动机的形式,没学过编译原理的人,可能理解起来困难点,实际上也是正则表达式的形式.下同) 例子:表示人的一个对象: 1

图像增强相关基础知识

图像增强处理-1 图像增强是图像处理中一个重要的内容,在图像生成,传输或变换的过程中,由于多种因素的影响,造成图像质量下降,图像模糊,特征淹没,给分析和识别带来困难.因此,按特定的需要将图像中感兴趣的特征友选择地突出,衰减不需要的特征,提高图像的可懂度是图像增强的主要内容.图像增强不考虑图像降质的原因,而且改善后的图像也不一定逼近原图像,这是它与图像复原本质的区别.图像增强的主要目的有两个:一是改善图像的视觉效果,提高图像的清晰度:二是将图像转换成一种更适合人类或机器进行分析处理的形式,一边从图

【RAC】RAC相关基础知识

[RAC]RAC相关基础知识 1.CRS简介    从Oracle 10G开始,oracle引进一套完整的集群管理解决方案—-Cluster-Ready Services,它包括集群连通性.消息和锁.负载管理等框架.从而使得RAC可以脱离第三方集群件,当然,CRS与第三方集群件可以共同使用. (1).CRS进程 CRS主要由三部分组成,三部分都作为守护进程出现 <1>CRSD:资源可用性维护的主要引擎.它用来执行高可用性恢复及管理操作,诸如维护OCR及管理应用资源,它保存着集群的信息状态和OC

iOS蓝牙开发(一)蓝牙相关基础知识

原文链接: http://liuyanwei.jumppo.com/2015/07/17/ios-BLE-1.html iOS蓝牙开发(一)蓝牙相关基础知识: 蓝牙常见名称和缩写 MFI ======= make for ipad ,iphone, itouch 专们为苹果设备制作的设备 BLE ==== buletouch low energy,蓝牙4.0设备因为低耗电,所以也叫做BLE peripheral,central == 外设和中心,发起连接的时central,被连接的设备为peri

iOS蓝牙开发(一)蓝牙相关基础知识(转)

转载自:http://www.cocoachina.com/ios/20150915/13454.html 原文作者:刘彦玮 蓝牙常见名称和缩写 MFI ======= make for ipad ,iphone, itouch 专们为苹果设备制作的设备 BLE ==== buletouch low energy,蓝牙4.0设备因为低耗电,所以也叫做BLE peripheral,central == 外设和中心,发起连接的时central,被连接的设备为perilheral service an

SSD 相关基础知识

SDD 基础知识 SSD(Solid State Drives)是固态硬盘,使用闪存颗粒来存储数据,闪存又可分为NAND Flash和NOR Flash,通常所说的SSD硬盘都使用NAND Flash芯片来存放数据.NOR型存储内容以编码为主,其功能多与运算相关:NAND型主要功能是存储资料. Nor Flash:主要用来执行片上程序 优点:具有很好的读写性能和随机访问性能,因此它先得到广泛的应用: 缺点:单片容量较小且写入速度较慢,决定了其应用范围较窄. NAND Flash:主要用在大容量存

SQL学习(一)相关基础知识

RDBMS基础知识 1.数据库是按照数据结构来组织.存储和管理数据的仓库:数据库是一些关联表的集合. 2.数据表是数据的矩阵,在一个数据库中的表看起来像一个简单的电子表格. 3.列:一列包含了相同的数据. 4.行:一行是一组相关的数据. 5.冗余:存储两倍数据,冗余降低了性能,但是提高了数据的安全性. 6.主键:主键是唯一的.一个数据表中只能包含一个主键. 7.外键:外键是用于关联两个表. 8.复合键:复合键将多个列作为索引健,一般用于符合索引. 9.索引:使用索引可快速访问数据库表中的特定信息