java:关于json解析工具选型(JSON-java,json-lib,gson,fastjson)
2017-09-07 11:45
721 查看
没有最好的工具,只有最适合的.
最近的项目需要对java 对象和json之间的序列化和反序列化,更准确的说是java bean对象和json之间的转换,使用哪个工具进行转换,让我犹豫了不少时间。
json工具有很多 http://json.org 中列出不少,我接触过的有JSON-java,json-lib,google-gson,还有阿里巴巴的fastjson。
JSON-java代码非常少,也很简洁易懂,对于json入门者真的非常适合阅读理解。
但功能也最简陋,没有提供方便的json->java bean对象的反序列化能力,前两天尝试想修改代码增加反序列化功能,但折腾一天发现修改的工作量实在太大,得不偿失,果断放弃了。
而且根据网上的评测,速度也很慢。所以放弃了。
但是目前gson是基于字段序列化的(fields-based),而不是基于getter/setter方法来决定哪些字段需要被序列化(properties),也就是就说对于一个对象中的成员(field),不论它是private还是public,也不论是否有getter/setter方法,都会被序列化.
参见gson官网提供的例子 Object-Examples
参见:
Why does GSON use fields and not getters/setters?
GsonDesignDocument
gson这种设计在有的应用场景下非常有用,但对于我的需求而言,这并不合适。
我只希望将拥有getter/setter方法的成员序列化,使用gson会将其他不需要被序列化的private成员也输出到json字符串中,这无疑是多余的,会让json体积更大。
下面是测试代码 :
输出结果
最近的项目需要对java 对象和json之间的序列化和反序列化,更准确的说是java bean对象和json之间的转换,使用哪个工具进行转换,让我犹豫了不少时间。
json工具有很多 http://json.org 中列出不少,我接触过的有JSON-java,json-lib,google-gson,还有阿里巴巴的fastjson。
JSON-java
我最早用过的是最简单的JSON-java(json.org官方提供的代码),是大约两年前了,所以这次再用到json的时候,首先想到就是它。JSON-java代码非常少,也很简洁易懂,对于json入门者真的非常适合阅读理解。
但功能也最简陋,没有提供方便的json->java bean对象的反序列化能力,前两天尝试想修改代码增加反序列化功能,但折腾一天发现修改的工作量实在太大,得不偿失,果断放弃了。
json-lib
对于json-lib,看了它的文档,功能上能满足我的需要,但它至少有4个依赖库,有些臃肿,这是我很在意思的。而且根据网上的评测,速度也很慢。所以放弃了。
google-gson
google出品的东西质量都不会差,gson拥有非常快的序列化反序列化速度,使用起来也非常方便灵活,网上有不少资料介绍它的用法。但是目前gson是基于字段序列化的(fields-based),而不是基于getter/setter方法来决定哪些字段需要被序列化(properties),也就是就说对于一个对象中的成员(field),不论它是private还是public,也不论是否有getter/setter方法,都会被序列化.
参见gson官网提供的例子 Object-Examples
However, there are good arguments to support properties as well. We intend to enhance Gson in a latter version to support properties as an alternate mapping for indicating Json fields. For now, Gson is fields-based. @摘自gson设计文档 GsonDesignDocument
参见:
Why does GSON use fields and not getters/setters?
GsonDesignDocument
gson这种设计在有的应用场景下非常有用,但对于我的需求而言,这并不合适。
我只希望将拥有getter/setter方法的成员序列化,使用gson会将其他不需要被序列化的private成员也输出到json字符串中,这无疑是多余的,会让json体积更大。
fastjson
阿里巴巴出品的fastjson是唯一有中文说明的json工具,看起来非常方便,也是目前号称java语言中最快的json库。支持getter/setter方法序列化,也支持对public的成员(field)序列化。这样就很灵活了,正好满足我的需求。下面是测试代码 :
package net.gdface.facelog; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.junit.Test; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; public class TestFastjson { public interface Person<T>{ } public static class User implements Person<String>{ private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public static class Group { private Long id; private String name; private List<User> users = new ArrayList<User>(); // public成员 不需要getter/setter方法直接序列化 public Date create_date=new Date(); public java.sql.Date sqldate=new java.sql.Date(birthdate.getTime()); public byte[] sampleArray=new byte[]{22,33,3,2,3,1,5,-1}; // 没有getter/setter方法的privated成员不会被序列化 private String privString="private string"; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<User> getUsers() { return users; } public void setUsers(List<User> users) { this.users = users; } public void addUser(User user) { users.add(user); } } @Test public void test() { Group group = new Group(); group.setId(0L); group.setName("admin"); User guestUser = new User(); guestUser.setId(2L); guestUser.setName("guest"); User rootUser = new User(); rootUser.setId(3L); rootUser.setName("root"); group.addUser(guestUser); group.addUser(rootUser); // 对日期使用ISO-8601日期格式 String jsonString = JSON.toJSONString(group,SerializerFeature.UseISO8601DateFormat); // 输出序列化结果 System.out.println(jsonString); // 反序列化 Group decodeGroup = JSON.parseObject(jsonString, Group.class); //输出反序列化结果 System.out.println(JSON.toJSONString(decodeGroup,SerializerFeature.UseISO8601DateFormat)); } }
输出结果
{"array":"FiEDAgMBBf8=","date":"2017-09-07T11:42:13.306+08:00","id":0,"name":"admin","sqldate":"2017-09-07T11:42:13.306+08:00","users":[{"id":2,"name":"guest"},{"id":3,"name":"root"}]} {"array":"FiEDAgMBBf8=","date":"2017-09-07T11:42:13.306+08:00","id":0,"name":"admin","sqldate":"2017-09-07T11:42:13.306+08:00","users":[{"id":2,"name":"guest"},{"id":3,"name":"root"}]}
相关文章推荐
- [转] 各种Json解析工具比较 - json-lib/Jackson/Gson/FastJson
- java中使用fastjson、jackson、json-lib解析JSON-------------------妈妈再也不用担心JSON解析
- java fastjson gson json-lib
- Json的解析--Json-lib、fastjosn、jackjson、gson
- java中使用fastjson、jackson、json-lib解析JSON-------------------妈妈再也不用担心JSON解析
- 解决fastjson、Jackson、Gson解析Json数据时,key为Java中关键字无法解析的问题
- JSON的解析[Java-JSON、FastJSON、GSON]
- 关于java.lang.NoClassDefFoundError,com/alibaba/fastjson/JSONObject的错误(json lib位置 引用错误)
- json-lib(ezmorph)、gson、flexJson、fastjson、jackson对比,实现java转json,json转java
- 在www.json.org上公布了很多Java下的json解析工具,其中org.json和json-lib比较简单,两者使用上差不多
- Java学习总结(二十)——JSON解析:官方解析,GSON解析,FastJSON解析,
- 你必须掌握的Java基础:JSON解析工具-json-lib
- json对象和java对象的相互转换方法(json-lib、jackson、fastjson、gson)
- java中使用fastjson、jackson、json-lib解析JSON---妈妈再也不用担心JSON解析
- java如何利用FastJSON、Gson、Jackson三种Json格式工具自定义时间序列化
- JSON解析工具比较,主要GSON和FastJSON
- java中使用fastjson、jackson、json-lib解析JSON-------------------妈妈再也不用担心JSON解析
- JSON解析工具比较,主要GSON和FastJSON
- Android进阶笔记14:3种JSON解析工具(org.json、fastjson、gson)
- json-lib(ezmorph)、gson、flexJson、fastjson、jackson对比,实现java转json,json转java