您的位置:首页 > Web前端 > JavaScript

安卓中的JSON解析

2015-07-22 08:58 483 查看
JSON指的是JavaScript对象表示法(JavaScript Object Notation),它是一种轻量级的文本数据交换格式,类似于XML,但是比XML更小、更快、更易解析。

JSON是基于JavaScript的一个子集,它使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台。JSON解析器和JSON库支持许多不同的编程语言。这些特性都使得JSON成为理想的数据交换语言,使其易于人们阅读和编写,同时也易于机器解析和生成。

1、JSON用于描述数据结构,有以下两种形式:

(1)“名称/值”对的集合

“名称/值”对的集合形式又称为JSON Object,其名称和值之间使用“:”隔开,一般的形式如下:

{name:value}

例如:
{"Width":"800","Height":"600"}
其中名称是字符串,值可以是字符串、数值、对象、布尔值、有序列表或者null值。这是一系列非排序的非排序的“名称/值”对,不同的语言中,这种“名称/值”可以理解为对象(object)、记录(record)、结构(struct)、字典(dictionary)、哈希表(hash table)、有键列表(keyed list)或者关联数组(associative array)等。

(2)值的有序列表

值的有序列表形式又称为JSON Array。在大部分语言中,值的有序列表被理解为数组(array),一个或者多个值用“,”分隔后,使用“[”和“]”括起来就形成了这样的列表,如下所示:

[collection,collection]

例如:
{
"employees":[
{"Width","800","Height":"600"},
{"Width","700","Height":"800"},
{"Width","900","Height":"900"},
]
}


2、解析JSON数据

解析JSON数据时,首先需要明确待解析的是JSON Object还是JSON Array,然后再解析。举例如下:

(1)解析JSON Object之一

下面是一个简单的JSON Object,name为名称,Lili是name的值,将name和Lili用“:”隔开,其文本如下。
{"name":"Lili"}
JSONObject.getString("String")方法可以得到JSON对象中的String名称对应的值。下面是对上面JSON对象的解析方法:
//新建JSONObject,JsonString字符串中为上面的JSON对象的文本
JSONObject demoJson=new JSONObject(jsonString);
//获取name名称对应的值
String s=demoJson.getString("name");


(2)解析JSON Object之二

下面是一个包含两个“名称/值”对的JSON对象,两个“名称/值”对分别是"name1":"android"和"name2","iphone",中间使用“,”隔开,其文本如下:
{"name1":"android","name2","iphone"}
上面JSON对象的解析方法如下:
//新建JSONObject对象,将jsonString字符串转换为JSONObject对象
//jsonString字符串为上面的文本
JSONObject demoJson = new JSONObject(jsonString);
//获取名称为name1对应的值
String name1=demoJson.getString("name1");
//获取名称为name2对应的值
String name2=demoJson.getString("name2");


(3)解析JSON Array

下面是一个简单的JSONArray,number为数组名称,[1,2,3]为数组的内容,其JSON文本表示如下:
{"number":[1,2,3]}
上面JSON Array解析方法如下:
//新建JSONObject对象,将jsonString字符串转换为JSONObject对象
//jsonString字符串为上面的文本
JSONObject demoJson = new JSONObject(jsonString);
//获取number对应的数组
JSONArray numberList=demoJson.getJSONArray("number");
//分别获取numberList中的每个值
for(int i=0;i<numberList.length();i++){
//因为数组中的类型为int,所以为getInt,其他getString、getLong具有类似的用法
System.out.println(numberList.getInt(i));
}


(4)解析JSON Object和JSON Array混合对象

下面是一个JSON Object和JSON Array的混合文本,mobile为JSON Object名称,其对应的值为JSON Array,JSON Array中包含的对象为JSON Object,其文本表示如下:
{"mobile":[{"name":"android"},{"name":"iphone"}]}
上面的文本解析方法如下:
//新建JSONObject对象,将jsonString字符串转换为JSONObject对象
//jsonString字符串为上面的文本
JSONObject demoJson = new JSONObject(jsonString);
//首先获取名为mobile的对象对应的值
//该值为JSONArray,这里创建一个JSONArray对象
JSONArray numberList=demoJson.getJSONArray("mobile");
//依次取出JSONArray中的值
for(int i=0;i<numberList.length();i++){
//从第i个取出JSONArray中的值为JSON Object“名称/值”对
//通过getString("name")获取对应的值
System.out.println(numberList.getJSONObject(i).getString("name"));
}


3、JSON打包

要想在客户端通过JSON传送对象,需要在JSON把信息全部“打包”之后将JSONObject转换为String。这样JSON就会将“打包”的信息按照特定标准的格式进行“压缩”,之后在服务端进行解析,读取通过JSON传送过来的信息。

Android提供的JSON解析类都在org.json下,主要有以下几个。

(1)JSONObject:可以看作是一个JSON对象,这是系统中有关JSON定义的基本单元,即前面提到的“名称/值”对。

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

(3)JSONArray:它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号的包裹,数值以“,”分隔,及前面提到的值的有序列表。

(4)JSONTokener:JSON解析类。

(5)JSONException:JSON中涉及的异常。

下面看一个用JSONObject、JSONArray来构建的JSON文本的例子,其需要构建的文本如下:
{
"Strings":{"Strings1":"MyStrings","Strings2","MyStrings"},
"Number":["987654321","123456789","456789123"],
"String":"good",
"Int":100,
"Boolean":false
}
构建上述文本的主要代码如下:
try {
//创建JSONObject对象
JSONObject mJSONObject=new JSONObject();
//为Strings创建JSONObject对象
JSONObject Strings=new JSONObject();
//为Strings JSONObject对象添加第一个“名称/值”对
Strings.put("Strings1", "MyStrings");
//为Strings JSONObject对象添加第二个“名称/值”对
Strings.put("Strings2", "MyStrings");
//将Strings添加到mJSONObject中
mJSONObject.put("Strings", Strings);
//为Number创建JSONArray对象
JSONArray Number=new JSONArray();
//将有序列表添加到Number中
Number.put("987654321").put("123456789").put("456789123");
//将Number添加到mJsonObject中
mJSONObject.put("Number", Number);
//将Int“名称/值”对添加到mJsonObject中
mJSONObject.put("Int", 100);
//将Boolean“名称/值”对添加到mJsonObject中
mJSONObject.put("Boolean", false);
} catch (JSONException ex) {
throw new RuntimeException(ex);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  json android 安卓