应用场景:
服务端返回给客户端的数据;java对象转json
客户端返回给服务端 json转为java对象
序列化与反序列化:FastJSON、Jackson、Gson
序列化:把Java对象转换为字节序列的过程。
反序列化:把字节序列恢复为Java对象的过程。
对象的序列化主要有两种用途:
持久化对象:把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;
网络传输对象:在网络上传送对象的字节序列。
implements Serializable、private static final long serialVersionUID = 8073662434406951441L;
json独立于任何语言的文本格式:简称json字符串
1 json数据最外层必须是{},里面是k/v形式
2 json字符串:
let user = {"id":11,"name":"zs","age":44} ,js可直接输出,类似java对象
3 json数组:k/v,js可直接输出
let arr = {
"p":[{"id":11,"name":"zs"},{"id":12,"name":"ls"}]
}
4 json集合:集合是用[]包裹,集合里直接就是一组一组的数据,js可直接输出
let list=[
{"id":11,"name":"zs"},
{"id":13"name":"ls"}
]
json数据解析、转换:
1 json字符串转java对象:后端收对象,前端收json串而返回的是对象,所以都要转换
java bean序列化成json字符串,json字符串反序列化成java bean ;
fastjson-java对象转json串
String jsonStr = JSON.toJSONString(obj);
fastjson-java数组转json数组
准备数据:User[] users ={u1,u2,u3};
String jsonArrStr = JSON.toJSONString(users,true); //true是目标的格式化
fastjson-list集合转json集合
List<User> ulist = new ArrayList();
Collections.addAll(ulist,u1,u2,u3);
String jsonListStr = JSON.toJSONString(ulist,true);//也可以不写第二个参数true,就是输出格式不一样而已
fastjson的注解:
@JSONField(ordinal=1)加在属性上,表示用来展示将来转成json串的输出顺序,1表示排在第一个位置
@JSONField(ordinal=1,name="xxx") 将来转成json串则以属性的这个name值输出
//serialize则这个字段则在序列化时就不会存在即不参与序列化,不序列化了就没必须序列化ordinal=1排序了
@JSONField(serialize=false)
fastjson-json转java对象(bean)
JSON.parseObject(strjson,Person.class); //json串转java对象,反序列化时必须要有无参构造
fastjson-json串转java数组或集合
List<Person> pList = JSON.parseArray(strjson,Person.class);
gson-java对象转json:
Gson gson = new Gson();
gson.toJson(user,User.class);
gson-java集合转json(数组):
List<User> users = new ArrayList<>();
gson.toJson(users); //没写范型
gson-json转java对象(bean):
gson.fromJson(strjson,User.class);
gson-json串转java数组或集合
Type type = new TypeToken<ArrayList<User>>{}.getType;
ArrayList<User> gson.fromJson(strjson,type);
jackson-java对象转json:
//依赖jackson-databind 2.12.4 默认已经有了
//jackson-datatype-jsr310 2.12.4 它包含上jackson-databind,引它就可以
ObjectMapper objectMapper = new ObjectMapper();
//注册日期处理的,如你的user中有日期,转换输出的日期格式显示可能有问题,所以可能需要这句
//objectMapper.findAndRegisterModules(); 【***】
//可能还需要在你日期属性加@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
objectMapper.writeValueAsString(user);
jackson-java集合转json(数组):
List<User> users = new ArrayList<>();
objectMapper.writeValueAsString(users);
jackson-json转java对象(bean):
objectMapper.readValue(jsonstr,User.class);
objectMapper.readValue(jsonString,new TypeReference<ResponseBean<List<User>>>(){});
jackson-json串转java数组或集合
objectMapper.readValue(jsonstr,new TypeReference<List<User>>(){});
//复杂点的
有问题的写法:
ResultBean r = objectMapper.readValue(jsonstr,ResultBean.class);
//要验证解析出来的里面的对象都对不对
//ResultBean这样转出来里面的集合是个Object或LinkedHashMap类型,需要强转如:
List<User> data = (List<User>) r.getData(); //打印发现不对
正确的写法:
ResultBean r = objectMapper.readValue(jsonstr,new TypeReference<ResultBean<List<User>>>(){});
jackson注解:
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss") 日期属性转成json显示格式
@JsonProperty("createDateTime") 指定属性转换为json字符串的key
@JsnIgnore 属性单独使用这个注解,即转json时某个字段不想转成json,就是忽略字段的
@JsonIgnoreProperties({"aaa","bbb"}) 写在pojo类上标明哪写字段忽略
FastJSON、Jackson、Gson性能比测:
1 序列化测试:
数据量较少(1、10、100)的时候,Gson的性能最优,且优势较明显,当对象数量在1000的时候,Jackson的性能开始上来了,
因此在对象数量在1~1000的时候,性能比拼:Gson>Jackson>FastJSON。
数量达到10000、100000级别的时候,Gson的性能下降的比较厉害,而FastJson和Jackson依旧保持着它们的快,
性能比较:Jackson>FastJSON>Gson
2 反序列化测试
对象数量为1、10、100的时候,Gson的性能最好,Jackson次之,性能排序为:Gson>Jackson>FastJson;
在对象数量为1000、10000的时候,Gson的性能下降比较明显,这个量级下性能排序为:FastJson>Jackson>Gson。
在对象数量为10w的时候,Jackson反超FastJson,性能排序为:Jackson>FastJson>Gson
3 结论
当数据量较小的时候(1~100),建议使用 Gson;
当数据量较大的时候,建议使用Jackson;
在大数据量的时候,虽然FastJson优势上来了,但是因为有漏洞,不得不放弃
json-数据通信-序列化-FastJSON-Jackson-Gson
猜你喜欢
转载自blog.csdn.net/gzi305366853/article/details/129916851
今日推荐
周排行