专栏首页10km的专栏java:关于json解析工具选型(JSON-java,json-lib,gson,fastjson)

java:关于json解析工具选型(JSON-java,json-lib,gson,fastjson)

没有最好的工具,只有最适合的. 最近的项目需要对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"}]}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • fastjson:获取类(Class)的所有可序列化字段(field)

    用fastjson对一个类进行序列化时,在没有类的实例只有类的Class的情况下,如果想知道这个Class有所有可以被序列化的字段名,可以用com.alibab...

    用户1148648
  • java:通过javadoc API读取java源码中的注释信息(comment)

    如何从java源码中读取注释信息?(注意不是指通过反射读取annotation类,是comment,就是程序员在源码中加的注释) 比如: /** ...

    用户1148648
  • java:java.util.Map和java.util.Set的Key类型转换

    google的guava项目提对Map供了丰富强大的转换功能(参见guava jar包中的com.google.common.collect.Maps ) ...

    用户1148648
  • 微服务架构设计之解耦合

    在各个 IT 行业的公司,我们会有大大小小的业务需求。当每个产品的业务功能越来越繁重时,也许用户的需求其实很简单,就想 One Click。但是,其实这一个按钮...

    程序猿Damon
  • Spring-IOC实现【01-XML配置方式】

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework....

    用户4919348
  • 完整案例分析再加知识整合——艾特抽象工厂模式,超详细的

    泰斗贤若如
  • 初探设计模式六大原则

    我想用贴近生活的语句描述一下自己对六种原则的理解。也就是不做专业性的阐述,而是描述一种自己学习后的理解和感受,因为能力一般而且水平有限,也许举的例子不尽妥当,还...

    外婆的彭湖湾
  • Mybatis学习笔记

    单个参数:不会做特殊处理,不管写什么直接映射进去,可用基本类型,也可传pojo 多个参数时:会特殊处理,将多参数处理成map,#{}就是从map集合中获取指定...

    晚上没宵夜
  • Java开发GUI之Menu菜单 原

        在MacOS上的软件都有一个菜单栏,会浮现在屏幕顶部,Java的awt包中也提供了构建菜单功能的相关组件,示例代码如下:

    珲少
  • 原型模式

    原型模式用于创建重复对象,同时又能保证性能。属于创建型模式,提供了一种创建对象的最佳方式。

扫码关注云+社区

领取腾讯云代金券