常用json库

json是一种轻量级的数据交换格式,基于两种数据结构:Object(name/value pair),Array(list);json具有平台无关性,完全独立于语言/系统的文本格式;
相比于xml比较轻量级,易于机器解析和生成;可以进行压缩;

常用的json库

注意事项

  • fastjson和Gson默认情况下不会将null变量写到json中,jackson会将不存在的字段设置为null;需要支持null:java对象转换json的细节处理
  • jackson反序列化为对象时,改对象所属的类必须有无参构造函数;
  • jackson的驼峰命名,当第一个变量用大写字母,例如BFlag,在序列化会变成bflag,全部转换成小写;
  • 非public的属性变量不会进行序列化和反序列化,除非有getter、setter方法(Gson除外);
  • jackson中@JsonProperty注解,可以解析非public的属性
  • jackson静态变量不序列化

Gson使用注意事项

序列化和反序列化

序列化过程是指将java对象转化成json串,反序列化是指将json串转化成java对象;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//假设对一个User bean进行序列化和反序列化
//jackson,主要使用ObjectMapper类
ObjectMapper objectMapper = new ObjectMapper();
// 将Java对象序列化为Json字符串
String objectToJson = objectMapper.writeValueAsString(initUser());
// 将Json字符串反序列化为Java对象
User user = objectMapper.readValue(objectToJson, User.class);
//fastjson,主要的类是JSON
// 将Java对象序列化为Json字符串
String objectToJson = JSON.toJSONString(initUser());
// 将Json字符串反序列化为Java对象
User user = JSON.parseObject(objectToJson, User.class);
//gson,主要使用Gson类,用GsonBuilder构造
Gson gson = new GsonBuilder().create();
// 将Java对象序列化为Json字符串
String objectToJson = gson.toJson(initUser());
// 将Json字符串反序列化为Java对象
User user = gson.fromJson(objectToJson, User.class);

jackson反序列化数组示例:

1
2
3
4
5
6
7
String json = "[{\"id\":\"12345\"},{\"id\":\"777\"}]";
//方法一
List<MessagesModel> model = mapper.readValue(json, TypeFactory.defaultInstance().constructCollectionType(List.class,MessagesModel.class));
//方法二
List<MessagesModel> model = mapper.readValue(json,new TypeReference<List<MessagesModel>>(){});
//方法三
List<MessagesModel> model = Arrays.asList(mapper.readValue(json,MessagesModel[].class));

fastJson快捷使用

1
2
3
4
5
import com.alibaba.fastjson.JSONObject;
JSONObject jsonObject = new JSONObject();
jsonObject.put("Id",1111);
jsonObject.put("name","hello");
...

JSONP

json用来传输数据,jsonp用来解决ajax请求跨域问题;
client传递一个callback参数(参数名可以自定义)给Server,Server返回数据时会将这个callback参数作为函数名来包裹住JSON数据
原理介绍和实现例子