json:
来源:阮一峰的网络日志
json(JavaScript Object Notation)是一种数据交换格式,相较于xml方式,其形式更简单便捷且固定。
json中的数据元素分三种:标量,序列和映射。
标量scalar:单独的字符串或者数字。“北京”
序列sequence:若干个相关的数据的集合,即数组或链表。“北京,上海”
映射mapping:即key-value对。又称散列或字典。“首都:北京”
语法:
并列元素用,隔开;
映射用:表示;
元素的集合(数组)用[]包含;
映射的集合(对象)用{}包含。
[{"city":"Beijing","people":1600,"area":16800},{"city":"Shanghai","people":1800,"area":6400}]
要求字符集为UTF-8。
数组与对象的区别:
1. 数组有顺序关系,对象没有。
2. 数组的元素没有名字,对象有。
(狭义的数组要求数据格式相同)
fastjson:
fastjson是alibaba为java开发的开源json库。使用时需引入。import com.alibaba.fastjson.JSON;
包含一个工具类,两个关键方法。
JSON:
json序列化与反序列化的工具类。
JSON.toJSONString:
序列化,将一个java bean序列化为JSON字符串。JSON.toJSONString(o),o的类可包括Object,set<Object>,list<Object>(目前见过的)。
序列化技巧:
1. 携带原object信息,避免反序列化时出现识别错误:
序列化:
Color color = Color.RED;
String text = JSON.toJSONString(color, SerializerFeature.WriteClassName);
System.out.println(text);
输出结果:{"@type":"java.awt.Color","r":255,"g":0,"b":0,"alpha":255}由于序列化带了类型信息,使得反序列化时能够自动进行类型识别,例如:String text = ...; // {"@type":"java.awt.Color","r":255,"g":0,"b":0,"alpha":255}Color color = (Color) JSON.parse(text);
2. 对日期的格式化序列化输出:
JSON.toJSONString(date, SerializerFeature.WriteDateUseDateFormat);
输出的结果为:
"2011-12-18 00:23:07"
你可以指定输出日期的格式,比如修改为输出毫秒:
JSON.toJSONStringWithDateFormat(date, "yyyy-MM-dd HH:mm:ss.SSS");
输出的结果为:
"2011-12-18 00:23:07.429"
JSON.parseObject:
反序列化,将一个JSON字符串反序列化为bean。JSON.parseObject(myJsonString, myClass.class),其中第二个参数包括.class文件,new TypeReference<Set<String>>() {
}(为set<String>生成一个class)等。
反序列化分类:
1. 指定Class信息反序列化
通过指定类型信息,可以很方便的将"JSON文本"反序列化为"Java Bean"对象,例如:
String text = ...; // {"r":255,"g":0,"b":0,"alpha":255}
Color color = JSON.parseObject(text, Color.class);
2. 类型集合的反序列化
这个接口类似于parseObject
String text = ...; // [{ ... }, { ... }]
List<User> users = JSON.parseArray(text, User.class);
3. 泛型的反序列化
如果你需要返回一个带泛型的对象,例如List<User>、Map<String, User>,你可以使用TypeReference来传入类型信息。
String text = ...; // {"name":{"name":"ljw",age:18}}
Map<String, User> userMap = JSON.parseObject(text, new TypeReference<Map<String, User>>() {});
4. 组合类型集合的反序列化
比如在网络协议中,经常会存在这样的组合:
[{/*header*/}, {/*body*/}]
fastjson对这种结构的反序列化有专门支持。
String text = ...; // [{/* header */}, {/* body */}]
Type[] types = new Type[] {Header.class, Body.class};
List<Object> list = JSON.parseArray(text, types);
Header header = (Header) list.get(0);
Body body = (Body) list.get(1);
json自动校验工具:
http://www.bejson.com/