json-lib(ezmorph)、gson、flexJson、fastjson、jackson对比,实现java转json,json转java

本文中所讲的所有代码都在此:json-test

目前关于java与json互转的工具包有很多 ,主流的主要有以下几个 :

  1. json-lib�0�2�0�2(依赖于�0�2ezmorph、commons-beanutils、commons-collections、groovy-all、oro、xom)
  2. gson
  3. flexjson
  4. fastjson
  5. jackson

改天将各个工具包的特性(包括使用方便程度、序列化与反序列化的性能)列出来,便于大家使用,目前仅发现flexjson是最使用上简洁的、无依赖的工具包,能够轻松实现复杂的(树型多层结构,并且允许不同层对象中包含相同字段名)POJO转json。

1、json-lib

        // java -> json
Classes sourceBean = TestCommon.getTestBean(); JsonConfig jc = new JsonConfig();
// 默认日期转换后的格式:"birthday":{"date":1,"day":3,"hours":0,"minutes":0,"month":0,"seconds":0,"time":-5364691200000,"timezoneOffset":-480,"year":-100}
// 这里添加格式自定义转换,解决默认日期格式不堪直视的问题。不加也可以,json-lib会把Date中所有字段输出出来,搞晕你。。。
jc.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());
// 过滤掉为空的属性,json-lib默认会将为空的String初始化为"",为空的Number初始化为0,总之不会为null。对于POJO来说,这种做法没法区分包装类型是否为空,所以某种意义上来说
// ,json-lib多此一举了。
jc.setJsonPropertyFilter(new PropertyFilter() { public boolean apply(Object source, String name, Object value) {
if (value == null) {
return true;
}
return false;
}
});
JSONObject jsonObject = JSONObject.fromObject(sourceBean, jc);
String jsonStr = jsonObject.toString();
System.out.println("java->json:" + jsonStr); /** json -> java */
JSONUtils.getMorpherRegistry().registerMorpher(
new DateMorpher(new String[] { "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd" })); jc = new JsonConfig();
jc.setRootClass(Classes.class); // 指定需要转换到的根类的类型。
// 问题来了,那么内部集合对应的类型哪里指定呢?通过测试发现,如果不指定会出现只有父类(Classes)会转换成原始的Bean,而其集合(students)属性会被自动转换成MorphDynaBean,这时候如果迭代这个List中对象,会抛出异常:java.lang.ClassCastException:
// net.sf.ezmorph.bean.MorphDynaBean cannot be cast to com.zt.test.Student
// 关于这个问题,官方并没有明确指明,但通过查看源码发现有一个方法能解决这个问题:JSONObject.setClassMap
// ,该方法的官方声明【Sets the current attribute/Class Map ;classMap : a Map of classes, every key identifies a property or a regexp 】
// 通过查看源码发现这就是我们想要的,通过它可以指定内部集合中包含的复合对象的类型,如果该内部类型中还包含了其它集合,处理 方法一样,统统加如到classMap中去,如下: Map<String, Class> classMap = new HashMap<String, Class>();
classMap.put("students", Student.class); //指定Classes的students字段的内部类型
jc.setClassMap(classMap); JSONObject targetJo = JSONObject.fromObject(jsonStr, jc);
Classes targetBean = (Classes) JSONObject.toBean(targetJo, jc); System.out.println("json->java:" + BeanUtils.describe(targetBean));
assertEquals(targetBean.getStudents().get(0).getName(), "张扇风");

2、gson

        package com.zt.test;

import junit.framework.TestCase;

import com.google.gson.Gson;

public class GsonTest extends TestCase {

	public void testGson() throws Exception {
Classes sourceBean = TestCommon.getTestBean();
Gson gson = new Gson();
// java -> json
String json = gson.toJson(sourceBean);
// System.out.println(json); // json -> java
Classes targetBean = gson.fromJson(json, Classes.class);
// System.out.println(BeanUtils.describe(targetBean));
assertEquals(targetBean.getStudents().get(0).getName(), "张扇风");
assertEquals(targetBean.getStudents().get(0).getBirthday(), TestCommon.DATEFORMAT.parse("1800-01-01 01:00:00"));
} public void testLoad() throws Exception {
for (int i = 0; i < 100000; i++) {
testGson();
}
} }

3、flex-json

// java -> json
Classes sourceBean = TestCommon.getTestBean();
JSONSerializer serializer = new JSONSerializer(); String jsonStr = serializer.deepSerialize(sourceBean);
//序列化的时候带着class字段,反序列化的时候就不需要指定目标class了。
System.out.println("java -> json:" + jsonStr); // json -> java
JSONDeserializer deserializer = new JSONDeserializer();
Classes targetBean = (Classes) deserializer.deserialize(jsonStr);
System.out.println("json -> java:" + BeanUtils.describe(targetBean) );
assertEquals(targetBean.getStudents().get(0).getName(), "张扇风");

4、fastjson

        package com.zt.test;

import junit.framework.TestCase;

import com.alibaba.fastjson.JSON;

public class FastJsonTest extends TestCase{
public void testFastJson() throws Exception {
Classes sourceBean = TestCommon.getTestBean();
// java -> json
String json = JSON.toJSONString(sourceBean); // System.out.println(json); // json -> java
Classes targetBean = JSON.parseObject(json, Classes.class); // System.out.println(BeanUtils.describe(targetBean));
assertEquals(targetBean.getStudents().get(0).getName(), "张扇风");
assertEquals(targetBean.getStudents().get(0).getBirthday(), TestCommon.DATEFORMAT.parse("1800-01-01 01:00:00"));
} public void testLoad() throws Exception {
for (int i = 0; i < 100000; i++) {
testFastJson();
}
} }

5、Jackson

        package com.zt.test;

import junit.framework.TestCase;

import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonTest extends TestCase{
public void testJackson() throws Exception {
Classes sourceBean = TestCommon.getTestBean();
// java -> json
ObjectMapper mapper = new ObjectMapper(); // can reuse, share globally String json = mapper.writeValueAsString(sourceBean); // System.out.println(json); // json -> java
Classes targetBean = mapper.readValue(json, Classes.class); // System.out.println(BeanUtils.describe(targetBean));
assertEquals(targetBean.getStudents().get(0).getName(), "张扇风");
assertEquals(targetBean.getStudents().get(0).getBirthday(), TestCommon.DATEFORMAT.parse("1800-01-01 01:00:00"));
} public void testLoad() throws Exception {
for (int i = 0; i < 100000; i++) {
testJackson();
}
} }

对比结果:

  依赖jar个数 上手容易度 功能、特性 性能  
json-lib�0�2 5 java <-> json、xml<->json;

自定义格式;

属性过滤;
25s  
gson 1 java <-> json (待补充) 15s  
flexjson 1 java <-> json(待补充) 12s  
fastjson 1 java <-> json(待补充) 3s  
jackson 1 java <-> json(待补充) 87s  
   
性能测试:单个用例测试10W次java-json互转,测试多次取均速,测试非严格,只看相对性能就好,如果对测试结果有疑问的可以自己下载源码测试

json-lib(ezmorph)、gson、flexJson、fastjson、jackson对比,实现java转json,json转java的更多相关文章

  1. Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例

    Android JSON解析库Gson和Fast-json的使用对比和图书列表小案例 继上篇json解析,我用了原生的json解析,但是在有些情况下我们不得不承认,一些优秀的json解析框架确实十分的 ...

  2. Java对【JSON数据的解析】--Gson解析法

    Gson和fastjson分别为谷歌和阿里巴巴对JSON数据进行处理封装的jar包 两者异同点: 相同点:都是根据JSON数据创建相应的类 不同点: 1.调用方式区别 谷歌:方法都是非静态的,需要先创 ...

  3. 各个JSON技术的比较(Jackson,Gson,Fastjson)的对比

    JSON技术的调研报告 一 .各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包, 包括 ...

  4. FastJson、Jackson、Gson进行Java对象转换Json细节处理

    前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...

  5. FastJson、Jackson、Gson进行Java对象转换Json的细节处理

    前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...

  6. Gson、FastJson、json-lib对比与实例

    一.各个JSON技术的对比(本部分摘抄自http://www.cnblogs.com/kunpengit/p/4001680.html): 1.json-libjson-lib最开始的也是应用最广泛的 ...

  7. JSON库之性能比较:JSON.simple VS GSON VS Jackson VS JSONP

    从http://www.open-open.com/lib/view/open1434377191317.html 转载 Java中哪个JSON库的解析速度是最快的? JSON已经成为当前服务器与WE ...

  8. JSON解析工具比较,主要GSON和FastJSON

    JSON解析工具比较,主要GSON和FastJSON 一 .各个JSON技术的简介和优劣 1.json-lib json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确 ...

  9. Android JSON 解析库的使用 - Gson 和 fast-json

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族 ...

  10. java中对于JSON 的处理 fastjson gson 系统自带的JSON 的选择

    从2月初到8月末,经历了一段痛苦的经历,现在总算感觉已经走出来了,经历那事之后 感觉对人与人之间的感情看的更透了,人也没那么浮躁了: 说实话 以前从来不知道鸟叫有多好听,现在突然觉的大自然真的很美,放 ...

随机推荐

  1. three.js添加3d模型

    three官方的几何体也就那么几个,想要生成各种各样的模型,其难度十分之大,这时引入外部模型也不失为一种选择.具体引入办法如下. 导入依赖 点击查看代码 import * as THREE from ...

  2. Azure 入门系列 (第五篇 Azure Storage)

    本系列 这个系列会介绍从 0 到 1 搭建一个 Web Application 的 Server. 间中还会带上一些真实开发常用的功能. 一共 6 篇 1. Virtual Machine (VM) ...

  3. 大模型应用开发初探 : 快速直观感受RAG

    大家好,我是Edison. 上一篇,我们了解了什么如何让一些开源小参数量模型具有函数调用的能力.这一篇,我们来快速了解下RAG(检索增强生成)并通过一个简单的DEMO来直观感受一下它的作用. RAG是 ...

  4. Brainstorm 了道题但是不会做

    题 因为没想出来暂时没定数据范围,不过应该会在 \(n^{2}\) 到 \(n^{3}\) 级别 我的一个思路是先对合法的方案连并查集,然后并查集内判重,但是不会算方案数,因为假如找到重的了不能直接看 ...

  5. std::vector 和 std::map 都支持以下比较运算符

    在 C++ 标准库中,std::vector 和 std::map 都支持以下比较运算符: ==(相等运算符) !=(不等运算符) <(小于运算符) <=(小于等于运算符) >(大于 ...

  6. USB通讯架构及数据模型

    注意: (1)一个usb设备由一个或者多个接口组成: (2)每一个接口为usb设备的一个功能,比如上面的usb设备由两个接口,一个可用于鼠标,一个可用于键盘: (3)每个接口占用usb设备的多个端口资 ...

  7. js 中什么情况下返回 undefined 值

    1. 声明变量没有赋值 <script> let num console.log(num) //undefined </script> 2. 访问不存在的属性 <scri ...

  8. Android复习(五)设备兼容—>支持刘海屏

    支持刘海屏 刘海屏是指某些设备显示屏上的一个区域延伸到显示面,这样既能为用户提供全面屏体验,又能为设备正面的重要传感器留出空间.Android 在搭载 Android 9(API 级别 28)及更高版 ...

  9. JOI Open 2017(口胡)

    T1 Amusement Park 题意:通信题.给定一张 \(n\) 个点 \(m\) 条边的无向连通图.Alice 会得到一个 \([0, 2^{60})\) 中的数 \(x\),并且她需要给这张 ...

  10. 云原生周刊:K8s 的 YAML 技巧 | 2023.12.4

    开源项目推荐 Helmfile Helmfile 是用于部署 Helm Chart 的声明性规范.其功能有: 保留图表值文件的目录并维护版本控制中的更改. 将 CI/CD 应用于配置更改. 定期同步以 ...