JSON
简介
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式
,易于人阅读和编写,同时也易于机器解析和生成,而且它是基于JavaScript 的
。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript 等)。这些特性使JSON成为理想的数据交换语言。
JSON 文件的文件类型是 .json
,JSON 文本的 MIME 类型是 application/json
-
JSON有两种结构:
“名/值”对的集合(A collection of name/value pairs)
。在不同的语言中,它被理解为对象,结构,关联数组等值的有序列表(An ordered list of values)
。在大部分语言中,它被理解为数组
JSON的基本形式
-
对象是一个无序的“名/值”对集合。
一个对象以“{”开始,“}”结束。每个“名称”后跟一个“:” ,“名/值”对之间使用“,” 分隔
:
-
数组是值(value)的有序集合。
一个数组以“[”开始,“]”结束。值之间使用“,”分隔
:
字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。
值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套
实例
JSON表示名称/值对:
{ "firstName": "test" }
多个名称/值对串在一起:
{ "firstName": "test", "lastName":"xxxx", "email": "xxx@new.com" }
{ “employees": [
{ "firstName": "a1", "lastName":"t1", "email": "y1@new.com" },
{ "firstName": "a2", "lastName":"t2", "email": "y2@new.com" },
{ "firstName": "a3", "lastName":"t3", "email": "y3@new.com" }
] }
JSON vs XML(了解即可)
-
可读性
JSON和XML的可读性可谓不相上下,XML略占上风。
-
可扩展性
XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
-
编码难度
XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
-
解码难度
XML的解析得考虑子节点父节点关系,让人头昏眼花,而JSON的解析难度几乎为零。
-
流行度
XML已经被业界广泛的使用,而JSON才刚刚开始,但在Ajax领域,JSON凭借自身的优势有可能最终取代XML。
在JavaScript中使用JSON
JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不需要任何特殊的 API 或工具包。
<script>
// 将JSON数据赋值给变量
var company =
{ “employees": [
{ "firstName": "a1", "lastName":"t1", "email": "y1@new.com" },
{ "firstName": "a2", "lastName":"t2", "email": "y2@new.com" },
{ "firstName": "a3", "lastName":"t3", "email": "y3@new.com" }
] };
// 获取第一个雇员的firstName信息
company.employees[0].fristName;
//修改数据
company.employees[0].fristName = “test”;
</script>
客户端处理JSON响应
- 服务器端返回JSON相应的文本表示,如:
{“name” : “xiaoming”, “age” : “18”}
- 客户端使用eval()函数将JSON文本转化为JavaScript对象:
<script>
//使用额外的圆括号可使eval()函数将来源输入无条件地视为表达式进行解析
var result = eval('(' + request.responseText + ')');
//取得相应的值
result.name;
result[''+ "name" +'']
</script>
Java解析JSON
JSON -> 值,Map,Bean
方法一,利用json-lib.jar
import java.util.Map;
//json-lib-2.4.jar
import net.sf.json.JSONObject;
public class JieXiJSON {
public static void main(String[] args) {
String jsonStr = "{\"key\":\"小红\",\"value\":\"18\"}";
JSONObject jsonObject = JSONObject.fromObject(jsonStr);
String key = jsonObject.getString("key");
String value = jsonObject.getString("value");
System.out.println(jsonObject);//{"key":"小红","value":"18"}
System.out.println(key + " " + value);//小红 18
// 将 Json转换为 Map
Map<String, Object> jsonToMap = (Map<String, Object>) JSONObject.toBean(jsonObject, Map.class);
System.out.println("将 Json转换为 Map:"+jsonToMap);//将Json转换为 Map:{value=18, key=小红}
// 将 Json转换为 JavaBean
jsonStr = "{\"name\":\"小李\",\"age\":\"18\"}";
JSONObject jsonObject1 = JSONObject.fromObject(jsonStr);
Student jsonToBean = (Student) JSONObject.toBean(jsonObject1, Student.class);
System.out.println(jsonToBean.getName()+jsonToBean.getAge());//小李18
}
}
方法二,利用fastjson.jar
//fastjson-1.2.51.jar
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class JieXiJSON {
public static void main(String[] args) {
String jsonStr = "{\"key\":\"小红\",\"value\":\"18\"}";
JSONObject jsonObject = JSON.parseObject(jsonStr);
String key = jsonObject.getString("key");
String value = jsonObject.getString("value");
System.out.println(jsonObject);//{"value":"18","key":"小红"}
System.out.println(key + " " + value);//小红 18
String str = "{\"result\":[{\"name\":\"小明\",\"age\":\"18\"},{\"name\":\"小红\",\"age\":\"19\"}],\"value\":\"200\"}";
System.out.println(str);
/*
{"result":
[
{"name":"小明","age":"18"},
{"name":"小红","age":"19"}
],
"value":"200"
}
*/
JSONObject resJsonObject = JSON.parseObject(str);
System.out.println(resJsonObject.getString("value"));//200
for (Object info : resJsonObject.getJSONArray("result")) {
JSONObject object = (JSONObject)info;
if(object.get("name") != null){
System.out.println(object.get("name").toString());
}
}
}
}
Map,Bean -> JSON
方法一,利用json-lib.jar
import java.util.HashMap;
import java.util.Map;
//json-lib-2.4.jar
import net.sf.json.JSONObject;
public class ToJson {
public static void main(String[] args) {
// 将Map解析成JSON
Map<String, Object> map = new HashMap<String, Object>();
map.put("1", "add");
map.put("2", "del");
map.put("3", 520);
JSONObject jsonMap = JSONObject.fromObject(map);
System.out.println("map:"+map);//map:{3=520, 2=del, 1=add}
System.out.println("JSON:"+jsonMap);//JSON:{"3":520,"2":"del","1":"add"}
// 将Bean解析成JSON
Student student = new Student("小红","23");
JSONObject jsonBean = JSONObject.fromObject(student);
System.out.println(jsonBean);//{"age":"23","name":"小红"}
// 嵌套解析成JSON
Map<String, Object> tempMap = new HashMap<String, Object>();
tempMap.put("班级", "1班");
tempMap.put("学生", student);
JSONObject json = JSONObject.fromObject(tempMap);
System.out.println(tempMap);
//{学生=test.constant.json.Student@158c4d4c, 班级=1班}
System.out.println(json);
//{"学生":{"age":23,"name":"小红"},"班级":"1班"}
}
}
方法二,利用fastjson.jar
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson.JSONObject;
public class ToJson {
public static void main(String[] args) {
// 将Map解析成JSON
Map<String, Object> map = new HashMap<String, Object>();
map.put("1", "add");
map.put("2", "del");
map.put("3", 520);
JSONObject jsonMap = new JSONObject(map);
System.out.println("map:"+map);//map:{1=add, 2=del, 3=520}
System.out.println("JSON:"+jsonMap);//JSON:{"1":"add","2":"del","3":520}
}
}