JSON 是轻量级数据交换格式,完全独立于语言的文本,人好读、机器好解析。支持 C、C++、C#、Java、JavaScript、Perl、Python 等。对象是无序的「名称/值」集合:{ 开始 } 结束,名称后跟冒号,对之间用逗号分隔。
一、JSON 书写格式

-
-
-
-
-
元素类型:string, number, object, array, true, false, null
例1、{ "name": "Obama"}
例2、{ "name": "Romney","age": 56}
例3、{ "city":{"name": "bj"},"weatherinfo":{"weather": "sunny"}}
例4、{
"city":{"name": "北京","city_id":"101010100"},
"weatherinfo":{"weather": "sunny","temp":"29度"}
}
例5、
[
{ "name": "张三", "age":22, "email": "zhangsan@qq.com" },
{ "name": "李四", "age":23, "email": "lisi@qq.com"},
{ "name": "王五", "age":24, "email": "wangwu@qq.com" }
]
例6、
{ "student":
[
{ "name": "张三", "age":22, "email": "zhangsan@qq.com" },
{ "name": "李四", "age":23, "email": "lisi@qq.com"},
{ "name": "王五", "age":24, "email": "wangwu@qq.com" }
]
}
二、Android 里解析 JSONObject / JSONArray
JSONObject
服务器上有 http://www.weather.com.cn/data/sk/101010100.html:
{"weatherinfo":
{"city":"北京","cityid":"101010100","temp":"21","WD":"东南风"
,"WS":"2 级","SD":"78%","WSE":"2","time":"21:10","isRadar":"1"
,"Radar":"JC_RADAR_AZ9010_JB"}
}
-
-
-
InputStream in = conn.getInputStream();
String jsonStr = DataUtil.Stream2String(in);
JSONObject jsonObject = new JSONObject(jsonStr);
JSONObject json = jsonObject.getJSONObject("weatherinfo");
String city = json.getString("city");
String temp = json.getString("temp");
JSONArray
http://192.168.1.101/Web/news.js 内容如下(注意:正规 JSON 键名应加双引号,这里按原文示例):
[
{
title : "国家发改委:台湾降油价和大陆没可比性",
description : "国家发改委副主任朱之鑫",
image : "http://192.168.1.101/Web/img/a.jpg",
comment : 163
},
{
title : "国家发改委:台湾降油价和大陆没可比性",
description : "国家发改委副主任朱之鑫",
image : "http://192.168.1.101/Web/img/b.jpg",
comment : 0
},
{
title : "国家发改委:台湾降油价和大陆没可比性",
description : "国家发改委副主任朱之鑫",
image : "http://192.168.1.101/Web/img/c.jpg",
comment : 0
}
]
String jsonStr = DataUtil.Stream2String(in);
JSONArray array = new JSONArray(jsonStr);
for (int i = 0; i < array.length(); i++) {
JSONObject obj = array.getJSONObject(i);
String title = obj.getString("title");
String description = obj.getString("description");
}
注意:json 数组并非全是由 json 对象组成;每个元素数据类型可以不同。
三、把对象生成 json 字符串
Logs.d("=========生成json数组字符串========================");
JSONObject j1 = new JSONObject();
j1.put("userName", "张三");
j1.put("passWord", "123456");
JSONObject j2 = new JSONObject();
j2.put("userName", "李四");
j2.put("passWord", "abcd");
JSONArray array = new JSONArray();
array.put(0, j1);
array.put(1, j2);
Logs.v(array.toString());
Logs.d("=========解析json数组========================");
for(int i = 0; i<array.length(); i++){
JSONObject jsonObject = array.getJSONObject(i);
String userName = jsonObject.getString("userName");
String passWord = jsonObject.getString("passWord");
Logs.v("userName :"+userName+", passWord :"+passWord);
}
四、fastjson 生成与解析
Fastjson 是 Java 高性能 JSON 库,parse 很快,支持 json.org 标准,以及基本类型、JavaBean、Collection、Map、Enum、泛型;可跑 JDK 5/6、Android、阿里云手机。常用四种:JavaBean、List<JavaBean>、List<String>、List<Map<String,Object>>。
生成:
String jsonString = JSON.toJSONString(object);
解析:
// 1. JavaBean
Person person = JSON.parseObject(jsonString, Person.class);
// 2. List<JavaBean>
List<Person> listPerson = JSON.parseArray(jsonString, Person.class);
// 3. List<String>
List<String> listString = JSON.parseArray(jsonString, String.class);
// 4. List<Map<String,Object>>
参考: JSON官网、FastJson
五、Object References
下面这份 JSON 里有两位作者、两本书。书通过 id 引用作者,authors 字段只存 id,而不是嵌套整份作者对象。这很常见:用 id 引用重复对象,缩小体积。
{
'authors': [
{
'id': 1,
'name': 'Joshua Bloch'
},
{
'id': 2,
'name': 'Neal Gafter'
}
],
'books': [
{
'title': 'Java Puzzlers: Traps, Pitfalls, and Corner Cases',
'isbn': '032133678X',
'authors':[1, 2]
},
{
'title': 'Effective Java (2nd Edition)',
'isbn': '0321356683',
'authors':[1]
}
]
}
| 场景 |
Android 做法 |
| 对象 |
new JSONObject(str) + getString / getJSONObject |
| 数组 |
new JSONArray(str) 再 for + getJSONObject |
| 生成 |
put 后 toString() |
| Bean / List |
fastjson toJSONString / parseObject / parseArray |
一句话总结:JSON 就是 {} 对象和 [] 数组;Android 用 JSONObject / JSONArray 按键取值,Bean 列表更省事时用 fastjson 的 toJSONString / parseObject / parseArray。