ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

几种json解析工具的区别

2020-06-28 14:56:38  阅读:445  来源: 互联网

标签:输出 null 几种 JSON SerializerFeature json key 解析


背景:最近工作中发现项目中大家使用的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 字段使用

 

标签:输出,null,几种,JSON,SerializerFeature,json,key,解析
来源: https://www.cnblogs.com/chengzhihua/p/13202774.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有