当前位置: 首页 > news >正文

关于Java JSON库的选择

Jackson和Fastjson(目前推荐用fastjson2)都是Java平台非常流行的JSON库,它们在性能方面不分伯仲,差距并不明显。如果是出于性能方面的考虑,任选其一皆可。

如下是测试相关参数,配置及代码:

  • Fastjson:2.0.60
  • Jackson:2.20.1

添加如下依赖:

<!-- fastjson -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.60</version>
</dependency><!-- jackson -->
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.20.1</version>
</dependency>
<dependency><groupId>com.fasterxml.jackson.datatype</groupId><artifactId>jackson-datatype-jsr310</artifactId><version>2.16.1</version><scope>compile</scope><exclusions><exclusion><artifactId>jackson-annotations</artifactId><groupId>com.fasterxml.jackson.core</groupId></exclusion><exclusion><artifactId>jackson-core</artifactId><groupId>com.fasterxml.jackson.core</groupId></exclusion><exclusion><artifactId>jackson-databind</artifactId><groupId>com.fasterxml.jackson.core</groupId></exclusion></exclusions>
</dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope>
</dependency>

用于测试的Java类:

/*** 用于序列化和反序列化测试的复杂对象*/
public class ComplexJsonObject {private Map<String, String> map;private List<Integer> list;private String str;private Integer i;private Long l;private Double d;private Float f;private Short s;private Byte b;private Character c;private Boolean bool;public Map<String, String> getMap() {return map;}public void setMap(Map<String, String> map) {this.map = map;}public List<Integer> getList() {return list;}public void setList(List<Integer> list) {this.list = list;}public String getStr() {return str;}public void setStr(String str) {this.str = str;}public Integer getI() {return i;}public void setI(Integer i) {this.i = i;}public Long getL() {return l;}public void setL(Long l) {this.l = l;}public Double getD() {return d;}public void setD(Double d) {this.d = d;}public Float getF() {return f;}public void setF(Float f) {this.f = f;}public Short getS() {return s;}public void setS(Short s) {this.s = s;}public Byte getB() {return b;}public void setB(Byte b) {this.b = b;}public Character getC() {return c;}public void setC(Character c) {this.c = c;}public Boolean getBool() {return bool;}public void setBool(Boolean bool) {this.bool = bool;}
}/*** 用于序列化和反序列化测试的简单对象*/
public class SimpleJsonObject {private String str;private Integer i;private Long l;private Double d;private Float f;private Short s;private Byte b;private Character c;private Boolean bool;public String getStr() {return str;}public void setStr(String str) {this.str = str;}public Integer getI() {return i;}public void setI(Integer i) {this.i = i;}public Long getL() {return l;}public void setL(Long l) {this.l = l;}public Double getD() {return d;}public void setD(Double d) {this.d = d;}public Float getF() {return f;}public void setF(Float f) {this.f = f;}public Short getS() {return s;}public void setS(Short s) {this.s = s;}public Byte getB() {return b;}public void setB(Byte b) {this.b = b;}public Character getC() {return c;}public void setC(Character c) {this.c = c;}public Boolean getBool() {return bool;}public void setBool(Boolean bool) {this.bool = bool;}
}/*** Fastjson工具*/
public final class FastjsonUtil {/*** 将对象序列化为JSON字符串* @param obj* @return*/public static String toJSON(Object obj) {return JSON.toJSONString(obj);}/*** 将JSON字符串反序列化为对象* @param json* @param clazz* @return* @param <T>*/public static <T> T fromJSON(String json, Class<T> clazz) {return JSON.parseObject(json, clazz);}
}/*** Jackson工具*/
public final class JacksonUtil {private static final ObjectMapper mapper;static {mapper = new ObjectMapper();mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);mapper.registerModule(new JavaTimeModule());mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));}/*** 将对象序列化为JSON字符串* @param obj* @return*/public static String toJSON(Object obj) {try {return mapper.writeValueAsString(obj);} catch (JsonProcessingException e) {e.printStackTrace();}return null;}/*** 将JSON字符串反序列化为对象* @param json* @param clazz* @return* @param <T>*/public static <T> T fromJSON(String json, Class<T> clazz) {try {return mapper.readValue(json, clazz);} catch (JsonProcessingException e) {e.printStackTrace();}return null;}/*** 格式化JSON字符串* @param json* @return*/public static String formatJSON(String json) {try {Object obj = mapper.readValue(json, Object.class);return mapper.writerWithDefaultPrettyPrinter().writeValueAsString(obj);} catch (JsonProcessingException e) {e.printStackTrace();}return null;}
}/*** JSON序列化和反序列化测试*/
public class JsonUtilTest extends TestCase {private ComplexJsonObject complexJsonObject = new ComplexJsonObject();private SimpleJsonObject simpleJsonObject = new SimpleJsonObject();{init();}public void init () {Map<String, String> map = new HashMap<String, String>();for (int i = 0; i < 50000; i++) {map.put("key" + i, "value" + i);}List<Integer> list = new ArrayList<Integer>();for (int i = 0; i < 50000; i++) {list.add(i);}complexJsonObject.setMap(map);complexJsonObject.setList(list);complexJsonObject.setStr("This is complex json object string");complexJsonObject.setI(1);complexJsonObject.setL(100000000L);complexJsonObject.setD(1.0);complexJsonObject.setF(3.14f);complexJsonObject.setS((short) 10);complexJsonObject.setB(Byte.valueOf((byte) 1));complexJsonObject.setC(Character.valueOf('c'));complexJsonObject.setBool(true);simpleJsonObject.setStr("This is simple json object string");simpleJsonObject.setI(1);simpleJsonObject.setL(100000000L);simpleJsonObject.setD(1.0);simpleJsonObject.setF(3.14f);simpleJsonObject.setS((short) 10);simpleJsonObject.setB(Byte.valueOf((byte) 1));simpleJsonObject.setC(Character.valueOf('c'));simpleJsonObject.setBool(true);}/*** 测试FastjsonUtil工具*/public void testFastjsonUtilWithComplexObject() {long start = System.currentTimeMillis();String json = FastjsonUtil.toJSON(complexJsonObject);long end = System.currentTimeMillis();System.out.println("testFastjsonUtilWithComplexObject serialization took " + (end - start) + " ms");//System.out.println(json);start = System.currentTimeMillis();FastjsonUtil.fromJSON(json, ComplexJsonObject.class);end = System.currentTimeMillis();System.out.println("testFastjsonUtilWithComplexObject deserialization took " + (end - start) + " ms");}/*** 测试FastjsonUtil工具*/public void testFastjsonUtilWithSimpleObject() {long start = System.currentTimeMillis();String json = FastjsonUtil.toJSON(simpleJsonObject);long end = System.currentTimeMillis();System.out.println("testFastjsonUtilWithSimpleObject serialization took " + (end - start) + " ms");//System.out.println(json);start = System.currentTimeMillis();FastjsonUtil.fromJSON(json, SimpleJsonObject.class);end = System.currentTimeMillis();System.out.println("testFastjsonUtilWithSimpleObject deserialization took " + (end - start) + " ms");}/*** 测试JacksonUtil工具*/public void testJacksonUtilWithComplexObject() {long start = System.currentTimeMillis();String json = JacksonUtil.toJSON(complexJsonObject);long end = System.currentTimeMillis();System.out.println("testJacksonUtilWithComplexObject serialization took " + (end - start) + " ms");//System.out.println(json);start = System.currentTimeMillis();JacksonUtil.fromJSON(json, ComplexJsonObject.class);end = System.currentTimeMillis();System.out.println("testJacksonUtilWithComplexObject deserialization took " + (end - start) + " ms");}/*** 测试JacksonUtil工具*/public void testJacksonUtilWithSimpleObject() {long start = System.currentTimeMillis();String json = JacksonUtil.toJSON(simpleJsonObject);long end = System.currentTimeMillis();System.out.println("testJacksonUtilWithSimpleObject serialization took " + (end - start) + " ms");//System.out.println(json);start = System.currentTimeMillis();JacksonUtil.fromJSON(json, SimpleJsonObject.class);end = System.currentTimeMillis();System.out.println("testJacksonUtilWithSimpleObject deserialization took " + (end - start) + " ms");}
}

但是如果考虑流行度,文档全面性,兼容性,特性支持,BUG监测等方面,就需要慎重选择了。

比如:Spring全家桶默认使用的JSON库是Jackson,考虑到兼容性可能需要优先考虑使用它。如果在序列化和反序列化时还需要考虑某些特性支持,还需要专门测试验证后进行敲定。

【参考】
深度对比Jackson和Fastjson,最终我还是选择了
Spring Boot Jackson 和Fast JSON 用哪个好啊

http://www.gsyq.cn/news/70381.html

相关文章:

  • 补发读后感2
  • qy_蓝桥杯编程系列_编程18 进制转换
  • 递归函数,闭包,装饰器3
  • How to do a biology experiment for a Physician.
  • LC 3479(2100) 线段树二分 水果成篮
  • 2025年上海办公室装修公司口碑排名:迎湖办公室装修实力可靠
  • Scrum 冲刺博客_4
  • 第二天项目
  • 2025年西南五大诚信的加拿大移民企业推荐,看哪家售后服务优
  • 2025年中国仿石砖十大龙头厂家推荐:看哪家产品质量好?
  • 实用指南:Qt-VLC: 一个集成VLC的开源跨平台媒体播放库
  • Scrum3 冲刺博客
  • Scrum2 冲刺博客
  • 2025年五大行星减速机厂家推荐排行榜,专业供应商与大型厂家
  • 2025年诚信的便携式粒子计数器销售厂家排行榜,尘埃粒子计数器/0.1um尘埃粒子计数器/28.3L尘埃粒子计数器粒子计数器销售厂家电话
  • 第3篇:Alpha阶段Day3冲刺日志
  • iStoreos/openWRT给不同IP的设备分配不同的网关/旁路由
  • 2025年度知名的房产律师推荐TOP5:看哪家胜诉率高
  • 上海商务宴请指南:这家黑珍珠素食餐厅如何兼得美味与格调?
  • 2025年上海中式餐厅精选:探寻东方美学与地道风味的盛宴
  • 2025年上海必访禅意餐厅指南:体验闹市中的静谧与治愈
  • 2025年上海必吃创意餐厅盘点:这5家高档美食地标重新定义奢华体验
  • 【2025最新】上海旅游美食攻略:五家不可错过的素食餐厅推荐清单
  • 防雨箱品牌推荐榜,充电桩防雨箱/开关防雨箱/监控防雨箱/防雨箱盖/不锈钢防雨箱供应厂家排行
  • 海泡石哪家质量好?哪家技术实力强?求推荐
  • 2025年12月京东e卡兑换,正规回收公司盘点:安全靠谱品牌红榜发布!
  • 深聊口碑不错的美国移民企业,看看哪家实力强
  • 北京专业打离婚官司的律所推荐与服务特点解析
  • 哪家无人机培训机构可以考证?行业机构选择参考
  • 团队博客 5:“租易 - 快捷租房管理小程序” Beta 阶段计划与改进方案