FastJson迁移至Jackson

背景

Fastjson在短期内连续爆出高危漏洞, 导致每次都得改代码上线, 已经粉转黑, 决定迁移到SpringBoot自带的Jackson;

相关粉转黑文章参考:

https://zhuanlan.zhihu.com/p/138215906

替换方法

添加依赖

Jackson版本等根据springboot版本来选, 因为我用的springboot版本较低, 所以用的 jackson版本是2.8

<properties><jackson.version>2.8.11jackson.version>properties>...<dependencies><dependency><groupId>com.fasterxml.jackson.coregroupId><artifactId>jackson-coreartifactId><version>${jackson-version}version>dependency><dependency><groupId>com.fasterxml.jackson.coregroupId><artifactId>jackson-databindartifactId><version>${jackson-version}version>dependency><dependency><groupId>com.fasterxml.jackson.coregroupId><artifactId>jackson-annotationsartifactId><version>${jackson-version}version>dependency><dependency><groupId>com.fasterxml.jackson.datatypegroupId><artifactId>jackson-datatype-json-orgartifactId><version>2.9.0version>dependency><dependency><groupId>com.jayway.jsonpathgroupId><artifactId>json-pathartifactId><version>2.4.0version>dependency>dependencies>

工具类

因为已经习惯Fastjson的语法, 所以极其不习惯在序列号之前还要new Mapper, 所以写了此工具类;

此工具类能基本保证Fastjson的默认行为与Jackson默认行为(序列号和反序列化)保持一致 (如忽略属性);

此工具类相关方法名参考 Fastjson方法名, 避免多记一份方法名;

package xxxx;

import com.fasterxml.jackson.core.JsonParser;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.core.type.TypeReference;import com.fasterxml.jackson.databind.DeserializationFeature;import com.fasterxml.jackson.databind.MapperFeature;import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.SerializationFeature;import com.fasterxml.jackson.datatype.jsonorg.JsonOrgModule;import com.jayway.jsonpath.Configuration;import com.jayway.jsonpath.DocumentContext;import com.jayway.jsonpath.JsonPath;import com.jayway.jsonpath.Option;import com.jayway.jsonpath.spi.json.JacksonJsonProvider;import com.jayway.jsonpath.spi.json.JsonProvider;import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider;import com.jayway.jsonpath.spi.mapper.MappingProvider;import org.json.JSONArray;import org.json.JSONObject;

import java.io.IOException;import java.util.EnumSet;import java.util.List;import java.util.Set;

/** * Jackson 高仿 fastjson 工具类 * * @description: 参考网站 * 1. 替换方法细节: https://blog.csdn.net/hujkay/article/details/97040048 * 2. JSONObject替换方案1(低于2.11.0): https://github.com/FasterXML/jackson-datatype-json-org/tree/2.9 * 3. JSONObject替换方案2(高于2.11.0): https://github.com/FasterXML/jackson-datatypes-misc * 4. JSONPath 工具类: https://github.com/json-path/JsonPath * * @author: weiqi * @create: 2020/05/28 **/public class JacksonUtil {

/**     * 单例内部类     */private static class SingletonHolder {private static final ObjectMapper mapper = new ObjectMapper();private static Configuration jsonPathConf = null;static {//Jackson 支持org.json.JSONObject            mapper.registerModule(new JsonOrgModule());

//Jackson 反序列化配置// 属性在json有, entity有, 但标记为ignore注解, 不抛出异常            mapper.configure(DeserializationFeature.FAIL_ON_IGNORED_PROPERTIES, false);// 属性在json有, entity没有,  不抛出异常            mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);// 支持json中的key无双引号            mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);// 支持带单引号的key            mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);// 支持0开头的整数, 如001            mapper.configure(JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS, true);// 支持回车符号            mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);// int类型为null, 则抛出异常            mapper.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, true);// 枚举找不到值, 不抛出异常            mapper.configure(DeserializationFeature.FAIL_ON_NUMBERS_FOR_ENUMS, false);

//Jackson 序列化配置// 空值输出 字段名: null            mapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, true);// transient注解不输出字段            mapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);

//JsonPath            Configuration.setDefaults(new Configuration.Defaults() {private final JsonProvider jsonProvider = new JacksonJsonProvider(mapper);private final MappingProvider mappingProvider = new JacksonMappingProvider(mapper);

@Overridepublic JsonProvider jsonProvider() {return jsonProvider;                }@Overridepublic MappingProvider mappingProvider() {return mappingProvider;                }@Overridepublic Setoptions() {return EnumSet.noneOf(Option.class);                }            });

            jsonPathConf = Configuration.defaultConfiguration()            .addOptions(Option.DEFAULT_PATH_LEAF_TO_NULL)            .addOptions(Option.SUPPRESS_EXCEPTIONS)            ;

//others        }    }

/**     * 单例get     * @return     */public static ObjectMapper getInstance(){return SingletonHolder.mapper;    }

/**     * clone 一个可以改配置     * @return     */public static ObjectMapper copyInstance(){        ObjectMapper copy = SingletonHolder.mapper.copy();return copy;    }

/**     * 指定Obj 对象-> 字符串     * @param obj     * @param      * @return     * @throws JsonProcessingException     */public static String toJSONString(T obj) throws JsonProcessingException {return getInstance().writeValueAsString(obj);    }/**     * 字符串 -> 指定Obj 对象     * @param json     * @param valueType     * @param      * @return     * @throws IOException     */public static T parseObject(String json, Class valueType) throws IOException {return getInstance().readValue(json, valueType);    }/**     * 字符串 -> 通用类JSONObject     * @param json     * @return     * @throws IOException     */public static JSONObject parseObject(String json) throws IOException {return getInstance().readValue(json, JSONObject.class);    }/**     * 字符串 -> 指定数组类     * @param json     * @param valueType     * @param      * @return     * @throws IOException     */public static ListparseArray(String json, Class valueType) throws IOException {return getInstance().readValue(json, new TypeReference>(){});    }/**     * 字符串 -> 通用数组类 JSONArray     * @param json     * @param      * @return     * @throws IOException     */public static JSONArray parseArray(String json) throws IOException {return getInstance().readValue(json, JSONArray.class);    }/**     * 高级: 获取JSONPath 帮助类     * @param jsonStr     * @return     * @throws IOException     */public static DocumentContext getDocumentContext(String jsonStr) throws IOException {        DocumentContext dcHelp = JsonPath.using(SingletonHolder.jsonPathConf).parse(jsonStr);return dcHelp;    }/**     * 高级: 解析 JSONPath     * @param dcHelp     * @param path     * @return     * @throws IOException     */public static Object evalPath(DocumentContext dcHelp, String path) throws IOException {// 参考链接 https://github.com/json-path/JsonPath        Object result = dcHelp.read(path);return result;    }/**     * 高级: 默认配置解析 JSONPath     * @param jsonStr     * @param path     * @return     * @throws IOException     */public static Object evalPath(String jsonStr, String path) throws IOException {        DocumentContext dcHelp = getDocumentContext(jsonStr);        Object o = evalPath(dcHelp, path);return  o;    }}

参考链接

  1. 替换方法细节: https://blog.csdn.net/hujkay/article/details/97040048
  2. JSONObject替换方案1(低于2.11.0): https://github.com/FasterXML/jackson-datatype-json-org/tree/2.9
  3. JSONObject替换方案2(高于2.11.0): https://github.com/FasterXML/jackson-datatypes-misc
  4. JSONPath 工具类: https://github.com/json-path/JsonPath

fastjson 添加key value_FastJson迁移至Jackson相关推荐

  1. fastjson 添加key value_Redis中设置了过期时间的Key,那么你还要知道些什么?

    来源:http://i7q.cn/4NHBun 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 1. DEL/SET/GE ...

  2. 【SpringMVC】从Fastjson迁移到Jackson,以及对技术选型的反思

    为什么要换掉fastjson 直接原因是fastjson无法支持注解形式的自定义序列化和反序列化,虽然其Github上的Wiki上说明是支持的.但是实测结果表明:Test类的序列化被fastjson的 ...

  3. 废弃fastjson!大型项目迁移Gson保姆级实战

    前言 本篇文章是我这一个多月来帮助组内废弃fastjson框架的总结,我们将大部分Java仓库从fastjson迁移至了Gson. 这么做的主要的原因是公司受够了fastjson频繁的安全漏洞问题,每 ...

  4. 教你如何处理Zabbix添加key总是not supported

    2019独角兽企业重金招聘Python工程师标准>>> Not Supported的解决方法 zabbix定义好key之后,总是会出现Not supported,看到这个问题,大家不 ...

  5. python列表sort倒序输出_Python 列表sort()添加key和reverse参数操作方法|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 本文是关于Python 列表sort()添加key和reverse参数操作方法介绍,之前python so ...

  6. router-view添加key解决同一路由复用相同组件

    router-view添加key解决同一路由复用相同组件,比如/page/1.page/2就会复用组件,不执行钩子函数 <router-view :key="$route.fullPa ...

  7. 杰理的蓝牙芯片的key是什么?以及该如何添加key?杰理key文件原理

    目录 一.简介 关于杰理芯片的key文件,实际上 杰理芯片特有的一种机制,而这种机制就是存在于杰理芯片特有的架构,也是杰理公司延续将近10年的特点,估计以后也会是这种机制.具体为什么,请听我娓娓道来, ...

  8. C# 使用 DictionaryEntry 在WinForm中给 ComboBox 添加 Key 和 Value

    C# 使用 DictionaryEntry 在WinForm中给 ComboBox 添加 Key 和 Value 1.DictionaryEntry      命名空间:  System.Collec ...

  9. 除了FastJson,你也应该了解一下Jackson(二)

    概览 上一篇文章介绍了Jackson中的映射器ObjectMapper,以及如何使用它来实现Json与Java对象之间的序列化和反序列化,最后介绍了Jackson中一些序列化/反序列化的高级特性.而本 ...

最新文章

  1. Android switchCompat. 和 Switch
  2. 给iOS开发者的React Native入门使用教程
  3. 从Vuex的Actions中理解JavaScript的解构赋值
  4. TLD(Tracking-Learning-Detection)学习与源码理解之(六)
  5. re正则表达式的使用
  6. mock以及特殊场景下对mock数据的处理
  7. 周末之个人杂想(四)
  8. Linux 添加计划任务
  9. modulenotfounderror python_python程序在命令行执行提示ModuleNotFoundError: No module named 'XXX' 解决方法...
  10. PointTrackNet:一种用于点云三维目标检测和跟踪的端到端网络
  11. Vmware安装Vmware Tools工具
  12. Windows磁盘格式、分区格式及类型
  13. 中兴android手机驱动,驱动天空 - 手机驱动 - 中兴手机 ZTE
  14. 应对风险和机会的措施讲解
  15. 读《从零开始学理财》
  16. Linux日志切割神器Logrotate的原理和配置详解,建议收藏!!!
  17. 2.15范冰增长黑客读书笔记
  18. 前端入门最全学习笔记--html
  19. iOS7人机界面指南 – ISUX原创翻译
  20. THU2015 fall 1-1 Team

热门文章

  1. 深度-图像风格变换【二】
  2. Java 解析 XML
  3. OpenCV3与深度学习实例-使用OpenPose进行人体姿态估算
  4. java中计时器的用法Timer和TimerTask的用法__java中利用Timer与TImerTask 计时器间隔执行任务...
  5. PowerDesigner 中的name与comment转换(转)
  6. 安卓项目之微信公众好---初体验
  7. 在有序数列里插入新元素(C语言)
  8. 关于读入带空格的字符串与输入输出重定向
  9. 信息学奥赛一本通 1130:找第一个只出现一次的字符 | OpenJudge NOI 1.7 02
  10. 信息学奥赛一本通 1100:金币 | 1969:【15NOIP普及组】金币 | OpenJudge NOI 1.5 45 | 洛谷 P2669 [NOIP2015 普及组] 金币