几种json解析工具的区别

Posted chengzhihua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了几种json解析工具的区别相关的知识,希望对你有一定的参考价值。

背景:最近工作中发现项目中大家使用的json工具类比较混乱,其中用的比较多的是google的Gson 和 阿里的FastJson,所以整理一下,记录一下两个json的区别,方便以后工作中更合理的使用。

1.Google的Gson
Gson是目前功能最全的Json解析神器,Gson当初是为因应Google公司内部需求而由Google自行研发而来,
但自从在2008年五月公开发布第一版后已被许多公司或用户应用。
Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。
而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。
类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。

gson 相关设置:

        GsonBuilder gsonBuilder = new GsonBuilder();
        // 不导出实体类中没有用@Expose注解的属性
        gsonBuilder.excludeFieldsWithoutExposeAnnotation();
        // 支持Map的key为复杂对象的形式
        gsonBuilder.enableComplexMapKeySerialization();
        // 格式化date型  
        gsonBuilder.setDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        // 会把字段首字母大写,注:对于实体上使用了@SerializedName注解的不会生效.
        gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE);
        Gson gson = gsonBuilder.create();
        // 属性值为空时,也会有对应值 null
        gson.serializeNulls();

 

 

2.阿里巴巴的FastJson
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。

 SerializerFeature.PrettyFormat:格式化输出
 SerializerFeature.WriteMapNullValue:是否输出值为null的字段,默认为false
 SerializerFeature.DisableCircularReferenceDetect:消除循环引用
SerializerFeature.WriteNullStringAsEmpty:将为null的字段值显示为
"" WriteNullListAsEmpty:List字段如果为null,输出为[],而非null WriteNullNumberAsZero:数值字段如果为null,输出为0,而非null WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null SkipTransientField:如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true SortField:按字段名称排序后输出。默认为false WriteDateUseDateFormat:全局修改日期格式,默认为false。 JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat); BeanToArray:将对象转为array输出 QuoteFieldNames:输出key时是否使用双引号,默认为true UseSingleQuotes:输出key时使用单引号而不是双引号,默认为false(经测试,这里的key是指所有的输出结果,而非key/value的key,而是key,和value都使用单引号或双引号输出) //先执行static代码块,再执行该方法(全局) //是否输出值为null的字段,默认为false JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteMapNullValue.getMask(); //数值字段如果为null,输出为0,而非null JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullNumberAsZero.getMask(); //List字段如果为null,输出为[],而非null JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullListAsEmpty.getMask(); //字符类型字段如果为null,输出为 "",而非null JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullStringAsEmpty.getMask() // 使用时传递参数 JSONObject.toJSONString(map, SerializerFeature.WriteMapNullValue,SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.WriteDateUseDateFormat);

源码:

 

public static String toJSONString(Object object, int defaultFeatures, SerializerFeature... features) {
        SerializeWriter out = new SerializeWriter((Writer) null, defaultFeatures, features);

        try {
            JSONSerializer serializer = new JSONSerializer(out);
            serializer.write(object);
            return out.toString();
        } finally {
            out.close();
        }
    }

 

代码中这个可以传递多个定制化设置,具体的设置参数在 com.alibaba.fastjson.serializer.SerializerFeature 类中

 

也可以在实体类中配合 @JSONField 字段使用

 

以上是关于几种json解析工具的区别的主要内容,如果未能解决你的问题,请参考以下文章

JSON解析的几种方式

java解析xml的几种方式哪种最好?

片段中的 JSON 解析 [关闭]

在java中解析xml有哪几种方法

解析:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项

java解析xml的几种方式哪种最好?