前言
喜欢在前言里讲一下自己的现状,或许能有共鸣的同学,更多的是留给自己一个纪念,几个月或者几年再回来看的时候还是会很有感慨。今天说说语言,json这种数据格式之前我做服务器端的时候天天接触,天真的以为json的世界里只有php的json_encode和json_decode,今天当我做客户端的时候,竟然将近一个多小时才搞定json的解析。这里我不是抨击php好坏,只是想说多学点东西,看看你不熟悉的领域,方能开阔自己的视野,方能知道天外有天,方能知道当初你看不上的工作其实你也不一定能很好的完成,扯多了,回来讲解json
什么是json
json(Javascript Object Natation)是一种轻量级的数据交换格式,相比xml这种数据交换格式来说,json相对解析更加简单一些,因此客户端和服务器的数据交换格式往往通过json进行交换
json一共有两种数据结构,一种是以(key/value)对形式存在的无序的jsonObject对象,一个对象以“{”(左花括号)开始,“}”(右花括号)结束。每个“名称”后跟一个“:”(冒号); “名称/值”对之间使用“,”(逗号)
例如:{”name“:"zhengyi.wzy"},这就是一个最简单的json对象,对于这种数据格式,key值必须是String,而value则可以是String,Number,Object,Array等数据类型
另一种数据格式就是有序的value的集合,这种形式被称为是jsonArray,数组是值(value)的有序集合。一个数组以”[“(左中括号)开始,”]“(右中括号)结束。值之间使用”,“(逗号)分隔
Android中json相关解析类
android的json解析部分都在包org.json下,主要有以下几个类:
JSONObject
这是系统中有关JSON定义的基本单元,其包含一对(key/value)数值
它对外部(External:应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{“json”: “Hello, World”},最外被大括号包裹,其中的key和value被冒号”:”分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put(“json”, “Hello, World!”),在key和value之间是以逗号”,”分隔
value的类型包括: JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL
有两种不同的取值方式:
get():在确定key存在的条件下使用,否则当无法检索到相关key时,将会抛出一个Exception异常信息
opt():这个方法相对比较灵活,当无法获取所指定数值时,将会返回一个默认值,并不会抛出异常(个人推荐使用这个方法)
JSONArray
它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:[”Alibaba“,”Baidu“,“Tecent”])
这个类的内部同样具有查询行为,get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值
同样JSONArray的value类型可以包括:JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL
Android解析实例
客户端一般从服务器获得都是字符串,直接new一个JSONObject即可,参考程序如下
获取json字符串
这个网址提供了json字符串:http://api.androidhive.info/contacts/, 我们可以开启一个线程发起http请求,获取json字符串,参考代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
private String getJsonByNetwork() {
// You can get json by this url
final String url = "http://api.androidhive.info/contacts/" ;
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
InputStream inputStream = null ;
String result = null ;
try {
HttpResponse response = httpClient.execute(httpGet);
inputStream = response.getEntity().getContent();
// Json is UTF-8 by default
BufferedReader reader = new BufferedReader( new InputStreamReader(
inputStream, "UTF-8" ));
StringBuilder sb = new StringBuilder();
String tmp = null ;
while ((tmp = reader.readLine()) != null ) {
sb.append(tmp);
}
result = sb.toString();
} catch (Exception e) {
try {
if (inputStream != null ) {
inputStream.close();
}
} catch (IOException se) {
}
}
return result;
}
|
解析json字符串
解析json字符串的步骤一般如下所示:
(1) 创建JSONObject:
1
2
|
// Create a JSONObject
JSONObject jsonObject = new JSONObject(result);
|
(2) 获取JSONArray,遍历JSONArray数组
1
2
3
4
5
6
7
|
// To get a specific JSONArray
JSONArray jsonArray = jsonObject.getJSONArray( "contacts" );
// To get items from the array
for ( int i = 0 ; i < jsonArray.length(); i ++) {
// TODO:Traverse the jsonarray
}
|
(3) 获取JSONObject
1
2
3
4
5
6
7
8
9
10
11
|
// Create a JSONObject
JSONObject jsonObject = new JSONObject(result);
// To get a specific JSONArray
JSONArray jsonArray = jsonObject.getJSONArray( "contacts" );
// To get items from the array
for ( int i = 0 ; i < jsonArray.length(); i++) {
// To get a specific JSONObject
JSONObject oneObject = jsonArray.getJSONObject(i);
}
|
(4)获取特定字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// Create a JSONObject
JSONObject jsonObject = new JSONObject(result);
// To get a specific JSONArray
JSONArray jsonArray = jsonObject.getJSONArray( "contacts" );
// To get items from the array
for ( int i = 0 ; i < jsonArray.length(); i++) {
// To get a specific JSONObject
JSONObject oneObject = jsonArray.getJSONObject(i);
// To get a specific string
String id = oneObject.getString( "id" );
String name = oneObject.getString( "name" );
Log.e( "wzy" , "id is:" + id + ", name is " + name);
}
|
解析结果:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
03-05 10:26:08.690: E/wzy(26401): id is:c200, name is Ravi Tamada
03-05 10:26:08.690: E/wzy(26401): id is:c201, name is Johnny Depp
03-05 10:26:08.690: E/wzy(26401): id is:c202, name is Leonardo Dicaprio
03-05 10:26:08.690: E/wzy(26401): id is:c203, name is John Wayne
03-05 10:26:08.691: E/wzy(26401): id is:c204, name is Angelina Jolie
03-05 10:26:08.691: E/wzy(26401): id is:c205, name is Dido
03-05 10:26:08.691: E/wzy(26401): id is:c206, name is Adele
03-05 10:26:08.692: E/wzy(26401): id is:c207, name is Hugh Jackman
03-05 10:26:08.693: E/wzy(26401): id is:c208, name is Will Smith
03-05 10:26:08.693: E/wzy(26401): id is:c209, name is Clint Eastwood
03-05 10:26:08.694: E/wzy(26401): id is:c2010, name is Barack Obama
03-05 10:26:08.694: E/wzy(26401): id is:c2011, name is Kate Winslet
03-05 10:26:08.695: E/wzy(26401): id is:c2012, name is Eminem
|