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/

 

posted on 2016-05-16 18:00  hh6plus  阅读(947)  评论(0编辑  收藏  举报