1. 什么是 JSON
- JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.
- JSON 是用字符串来表示 JavaScript 对象, 例如可以在 Servlet 中发送一个 JSON 格式的字符串给
客户端 JavaScript, JavaScript 可以执行这个字符串,得到一个 JavaScript 对象.
2. JSON 对象语法
2.1 JSON 语法
- 数据由逗号分隔;
- 花括号保存对象;
- 方括号保存数组;
- 属性名必须使用双引号括起来, 单引号不行!!
- 示例:
var person = {"name":"zhangsan","age": 18,"sex":"male"};
2.2 JSON 值
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true 或 false)
- 数组(在方括号中)
- 对象(在花括号中)
- null
// 示例
<html>
<head>
<script type="text/javascript">
window.onload = function(){
var str = "{"name":"zhangsan", "age":18, "sex":"male"}";
// eval: 将字符串当成 javascript 代码来执行
// 此处返回的是 {"name":"zhangsan","age":18,"sex":"male"}, 表示 JSON 对象
var person = eval("("+str+")");
alert(person.name+","+person.age+","+person.sex);
}
</script>
</head>
<body>
</body>
</html>
# parse(): JS 中用于从一个字符串中解析出json对象;
# stringfy(): JS 中用于从一个对象解析出字符串;
3. JSON-lib
3.1 它是什么?
- 它可以把 JavaBean 转换成 JSON 串;
3.2 jar 包
- 核心包:
json-lib.jar
- 依赖包:
commons-lang.jar
commons-beanutils.jar
commons-logging.jar
commons-collections.jar
ezmorph.jar
xom-1.1.jar
3.3 核心类
-
JSONObject
- 父类为 Map
toString()
JSONObject map = JSONObject.fromObject(person);
把对象转换成 JSONObject 对象;
-
JSONArray
- 父类为 List
toString()
JSONArray jsonArray = JSONArray.fromObject(list);
把 list 转换成 JSONArray 对象;
4. FastJson
- 它也可以把 JavaBean 转换成字符串, 由阿里提供;
常用方法
- String s = JSON.toJSONString(集合);
- String s = JSON.toJSONString(对象);
// 存在问题一: 默认情况下, fastjson 的循环引用
public void fun(){
List<Customer> list = new ArrayList<Customer>();
Customer c = new Customer();
c.setName("张三");
c.setAge(20);
// 集合中存在两个相同的 Customer
list.add(c);
list.add(c);
// 转换成 json 的字符串
String jsonString = JSON.toJSONString(list);
System.out.println(jsonString);
// 输出结果: [{"name":"张三","age":20},{"$ref":"$[0]"}]
// 其中,第二个值是引用的第一个值; 如果将该 json 字符串发送到客户端,是无法解析的
// 解决方案: 禁止循环的引用
String jsonString = JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect);
System.out.println(jsonString);
// 输出结果: [{"name":"张三","age":20},{"name":"张三","age":20}]
}
// 存在问题二: 死循环
public class Person{
private String pname;
private Role role;
get 和 set 方法
}
public class Role{
private String rname;
private Person person;
get 和 set 方法
}
public void fun(){
Person p = new Person();
p.setPname("张三");
Role r = new Role();
r.setRname("管理员");
p.setRole(r);
r.setPerson(p);
String jsonString = JSON.toJSONString(p, SerializerFeature.DisableCircularReferenceDetect);
System.out.println(jsonString);
// 栈溢出异常;
}
// 解决方案:
public class Person{
private String pname;
// 添加注解, 表示该属性不转换成 json 字符串
@JSONField(serialize=false)
private Role role;
get 和 set 方法
}
参考资料: