java jackson 性能_Jackson和fastjson简单用法及性能对比

本文介绍了Java中处理JSON数据的Jackson和Fastjson两个流行库,并通过实例展示了它们的使用方法,包括对象、列表和Map的序列化与反序列化。在性能对比部分,发现对于少量数据,Jackson在序列化和反序列化上表现更好,但随着数据量增加,Fastjson的性能更优。因此,选择JSON库应根据实际数据量来决定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

Java处理JSON数据有三个比较流行的类库FastJSON、Gson和Jackson。fastjson是阿里做的国有开源Java工具包,jackson是spring mvc内置的json转换工具,孰强孰弱呢?

1 Json基本介绍

JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。

1.1 Json两种结构

JSON有两种表示结构,对象和数组。

对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。

{

key1:value1,

key2:value2,

...

}

其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组。

数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。

[

{

key1:value1,

key2:value2

},

{

key3:value3,

key4:value4

}

]

1.2字符串和Json表示方式

字符串:指使用“”双引号或’’单引号包括的字符。

例如:var comStr = ‘this is string’;

json字符串:指的是符合json格式要求的js字符串。

例如:var jsonStr = “{StudentID:’100’,Name:’tmac’,Hometown:’usa’}”;

json对象:指符合json格式要求的js对象。

例如:var jsonObj = { StudentID: “100”, Name: “tmac”, Hometown: “usa” };

2 几种简单的Json库使用方式

2.1 jackson使用

使用的jar包:

jackson-mapper-asl-1.8.11.jar

jackson-core-2.5.1.jar

jackson-databind-2.4.5.jar

也可是使用maven源配置。

一个简单的bean类:

packagecom.mmall.pojo;importlombok.Data;/*** Created by sww_6 on 2018/8/24.*/@Datapublic classUsers {privateString username;privateInteger age;

}

java对象到json字符串(序列化):

packagecom.mmall.common;importcom.mmall.pojo.Users;importjava.io.IOException;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importorg.codehaus.jackson.map.ObjectMapper;/*** Created by sww_6 on 2018/8/24.*/

public classBeanToJson {public static voidmain(String[] args) {//将对象转成json字符串

Users users = newUsers();

users.setAge(18);

users.setUsername("魏璎珞");

ObjectMapper objectMapper= newObjectMapper();try{

String jsonString=objectMapper.writeValueAsString(users);

System.out.println(jsonString);

}catch(IOException e) {

e.printStackTrace();

}//将list集合转换成json字符串

Users user2 = newUsers();

user2.setAge(18);

user2.setUsername("沉壁");

Users user3= newUsers();

user3.setAge(18);

user3.setUsername("永琪");

List jsonList = new ArrayList<>();

jsonList.add(user2);

jsonList.add(user3);try{

String list=objectMapper.writeValueAsString(jsonList);

System.out.println(list);

}catch(IOException e) {

e.printStackTrace();

}//将map集合转换成json字符串

Map map = newHashMap();

map.put("user2", user2);

map.put("user3", user3);try{

String mapJson=objectMapper.writeValueAsString(map);

System.out.println(mapJson);

}catch(IOException e) {

e.printStackTrace();

}

}

}

运行结果:

34db9ea53e6fa8b83d43d08feea4a06a.png

一个含java对象集合变量的类,用于json字符串数组到对象集合:

packagecom.mmall.common;importcom.mmall.pojo.Users;importjava.io.IOException;importjava.util.List;importjava.util.Map;importorg.codehaus.jackson.map.ObjectMapper;/*** Created by sww_6 on 2018/8/24.*/

public classJsonToBeans {public static voidmain(String[] args) {//将json字符串转化为java对象

String userJson = "{\"username\":\"福康安\",\"age\":18}";

ObjectMapper objectMapper= newObjectMapper();try{

Users users= objectMapper.readValue(userJson, Users.class);

System.out.println(users+ ":" + users.getUsername() + "," +users.getAge());

}catch(IOException e) {

e.printStackTrace();

}//将json字符串转化成java的list集合

String jsonList = "{\"userList\":[{\"username\":\"永基\",\"age\":18},{\"username\":\"永荣\",\"age\":18}]}";try{

ListBean listBean= objectMapper.readValue(jsonList, ListBean.class);

System.out.println(listBean.getUserList());

}catch(IOException e) {

e.printStackTrace();

}//将json转化成java的map集合

String jsonMap = "{\"username\":\"五阿哥\",\"age\":18}";try{

Map map= objectMapper.readValue(jsonMap, Map.class);

System.out.println(map+ ":" + map.get("username") + "," + map.get("age"));

}catch(IOException e) {

e.printStackTrace();

}//将json字符串数组转换成Map的list集合。

String json = "[{\"username\":\"傅恒\",\"age\":11},{\"username\":\"hsj\",\"age\":12}]";try{

List list = objectMapper.readValue(json, List.class);

System.out.println(list.get(0).get("username"));

}catch(IOException e) {

e.printStackTrace();

}

}

}

运行结果:

e83964c86a6252e4ebbe9dca0134ca88.png

2.2 fastjson使用

fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。主要特点:

1

2

a) 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson)

b) 强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum)

c) 零依赖(没有依赖其它任何类库除了JDK)

2.2.1fastjson生成json字符串

(JavaBean,List,List,List)

String jsonStrng= JSON.toJSONString(object);

2.2.2fastjson 解析json字符串为四种类型

1. JavaBean

Person person= JSON.parseObject(jsonString, Person.class);2. ListList listPerson =JSON.parseArray(jsonString, Person.class);3. ListList listString = JSON.parseArray(jsonString, String.class);4. List>List> listMap = JSON.parseObject(jsonString, new TypeReference>>(){});

2.2.3实现测试

需要的jar包fastjson-1.2.5.jar,也可以maven配置。

java对象到json字符串(序列化):(采用jackson下的user和listbean类)

packagecom.yongjun.stock.controller;importcom.alibaba.fastjson.JSON;importcom.yongjun.stock.model.dto.Users;importjava.io.IOException;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.List;importjava.util.Map;/*** Created by sww_6 on 2018/8/24.*/

public classBeanToJson {public static voidmain(String[] args) {//将对象转成json字符串

Users users = newUsers();

users.setAge(18);

users.setUsername("魏璎珞");

String json=JSON.toJSONString(users);

System.out.println(json);//将list集合转换成json字符串

Users user2 = newUsers();

user2.setAge(18);

user2.setUsername("沉壁");

Users user3= newUsers();

user3.setAge(18);

user3.setUsername("永琪");

List jsonList = new ArrayList<>();

jsonList.add(user2);

jsonList.add(user3);

String jsonLists=JSON.toJSONString(jsonList);

System.out.println(jsonLists);//将map集合转换成json字符串

Map map = newHashMap();

map.put("user2", user2);

map.put("user3", user3);

String jsonmap=JSON.toJSONString(map);

System.out.println(jsonmap);

}

}

运行结果:

0b39ae5c9b7d1122ba4803990401950f.png

json字符串转换成java对象(反序列化):

packagecom.yongjun.stock.controller;importcom.alibaba.fastjson.JSON;importcom.yongjun.stock.model.ListBean;importcom.yongjun.stock.model.dto.Users;importjava.util.List;importjava.util.Map;/*** Created by sww_6 on 2018/8/24.*/

public classJsonToBeans {public static voidmain(String[] args) {//将json字符串转化为java对象

String userJson = "{\"username\":\"福康安\",\"age\":18}";

Users users= JSON.parseObject(userJson, Users.class);

System.out.println(users+ ":" + users.getUsername() + "," +users.getAge());//将json字符串转化成java的list集合

String jsonList = "{\"userList\":[{\"username\":\"永基\",\"age\":18},{\"username\":\"永荣\",\"age\":18}]}";

ListBean listBean= JSON.parseObject(jsonList, ListBean.class);

System.out.println(listBean.getUserList());//将json转化成java的map集合

String jsonMap = "{\"username\":\"五阿哥\",\"age\":18}";

Map map= JSON.parseObject(jsonMap, Map.class);

System.out.println(map+ ":" + map.get("username") + "," + map.get("age"));//将json字符串数组转换成Map的list集合。

String json = "[{\"username\":\"傅恒\",\"age\":11},{\"username\":\"hsj\",\"age\":12}]";

List list = JSON.parseObject(json, List.class);

System.out.println(list.get(0).get("username"));

}

}

运行结果:

8f69ecea6456595b81b43111b6c10d91.png

3 Jackson和fastson性能对比

3.1 java对象到json字符串(序列化)对比:

{“age”:10,”username”:”魏璎珞”},将对象转换成json字符串

packagecom.yongjun.stock.controller;importcom.alibaba.fastjson.JSON;importcom.yongjun.stock.model.dto.Users;/*** Created by sww_6 on 2018/8/24.*/

public classBeanToJson {public static voidmain(String[] args) {//将对象转成json字符串

Users users = newUsers();

users.setAge(18);

users.setUsername("魏璎珞");long startTime = System.currentTimeMillis(); //获取开始时间

for (int i = 0; i < 1000; i++) {

String s= JSON.toJSONString(users);//user: {"age":10,"username":"jzx"}//String s = objectMapper.writeValueAsString(user);

}long endTime = System.currentTimeMillis(); //获取结束时间

System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间

}

}

试jackson和fastjson序列化消耗时间,选取100,1000,10000,100000进行测试,同样环境每次运行3次,结果如下(ms):

Json库 100 1000 10000 100000Jackson50|47|47 65|63|64 214|216|221 375|377|381Fastjson93|92|91 104|101|99 193|197|200 321|330|311

{"user2":{"age":12,"username":"hsj"},"user1":{"age":11,"username":"sss"}},将map集合转换成json字符串

long startTime = System.currentTimeMillis(); //获取开始时间

for(int i=0;i<100;i++){

userMapJson=JSON.toJSONString(userMap);//userMapJson = objectMapper.writeValueAsString(userMap);

}long endTime = System.currentTimeMillis(); //获取结束时间

System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间

Json库 100 1000 10000 100000Jackson57|56|53 92|99|98 237|238|227 431|437|444Fastjson96|91|92 129|129|124 282|280|276 374|362|372

1

2

3由此结果可知,序列化时,在少量数据时,jackson性能比fastson要好,当数据量越来越大时,fastson的性能要好于jackson;序列化时选取何种json库,可根据数据多少进行选择。

3.2 json字符串转换成java对象(反序列化)对比:

{\”username\”:\”jzx\”,\”age\”:10},将json字符串转换成java对象

String userJson = "{\"username\":\"jzx\",\"age\":10}";

User user=null;

ObjectMapper objectMapper= newObjectMapper();long startTime = System.currentTimeMillis(); //获取开始时间

for(int i=0;i<100;i++){

user= JSON.parseObject(userJson,User.class);//user = objectMapper.readValue(userJson,User.class);

}long endTime = System.currentTimeMillis(); //获取结束时间

System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间

测试jackson和fastjson反序列化消耗时间,选取100,1000,10000,100000进行测试,同样环境每次运行3次,结果如下(ms):1

2Json库100 1000 10000 100000Jackson48|51|47 73|77|76 350|355|364 523|526|526Fastjson95|93|95 133|127|127 306|304|308 413|429|422

测试方法相同,结果如下(ms):1

2Json库100 1000 10000 100000Jackson64|61|56 120|115|110 343|344|348 554|540|546Fastjson105|104|102 155|158|156 374|367|377 481|487|469

1

2

3{\"username\":\"hsj\",\"age\":12},将json字符串转换成map集合:

Json库 100 1000 10000 100000Jackson44|44|39 85|87|80 391|381|382 469|484|476Fastjson74|71|71 111|111|112 334|297|301 515|502|500

由此结果可知,反序列化时,除在map转化有些不同,在少量数据时,jackson性能比fastson要好,当数据量越来越大时,fastson的性能要好于jackson;序列化时选取何种json库,可根据数据多少进行选择。

同时通过复杂数据进行反序列化测试,测试fastjson和jackson,效果差别则很大,性能差距近乎5倍, 此时,fastjson明显要好于jackson。

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值