fastjson 添加key value_FastJson迁移至Jackson
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; }}
参考链接
- 替换方法细节: https://blog.csdn.net/hujkay/article/details/97040048
- JSONObject替换方案1(低于2.11.0): https://github.com/FasterXML/jackson-datatype-json-org/tree/2.9
- JSONObject替换方案2(高于2.11.0): https://github.com/FasterXML/jackson-datatypes-misc
- JSONPath 工具类: https://github.com/json-path/JsonPath
fastjson 添加key value_FastJson迁移至Jackson相关推荐
- fastjson 添加key value_Redis中设置了过期时间的Key,那么你还要知道些什么?
来源:http://i7q.cn/4NHBun 熟悉Redis的同学应该知道,Redis的每个Key都可以设置一个过期时间,当达到过期时间的时候,这个key就会被自动删除. 1. DEL/SET/GE ...
- 【SpringMVC】从Fastjson迁移到Jackson,以及对技术选型的反思
为什么要换掉fastjson 直接原因是fastjson无法支持注解形式的自定义序列化和反序列化,虽然其Github上的Wiki上说明是支持的.但是实测结果表明:Test类的序列化被fastjson的 ...
- 废弃fastjson!大型项目迁移Gson保姆级实战
前言 本篇文章是我这一个多月来帮助组内废弃fastjson框架的总结,我们将大部分Java仓库从fastjson迁移至了Gson. 这么做的主要的原因是公司受够了fastjson频繁的安全漏洞问题,每 ...
- 教你如何处理Zabbix添加key总是not supported
2019独角兽企业重金招聘Python工程师标准>>> Not Supported的解决方法 zabbix定义好key之后,总是会出现Not supported,看到这个问题,大家不 ...
- python列表sort倒序输出_Python 列表sort()添加key和reverse参数操作方法|python基础教程|python入门|python教程...
https://www.xin3721.com/eschool/pythonxin3721/ 本文是关于Python 列表sort()添加key和reverse参数操作方法介绍,之前python so ...
- router-view添加key解决同一路由复用相同组件
router-view添加key解决同一路由复用相同组件,比如/page/1.page/2就会复用组件,不执行钩子函数 <router-view :key="$route.fullPa ...
- 杰理的蓝牙芯片的key是什么?以及该如何添加key?杰理key文件原理
目录 一.简介 关于杰理芯片的key文件,实际上 杰理芯片特有的一种机制,而这种机制就是存在于杰理芯片特有的架构,也是杰理公司延续将近10年的特点,估计以后也会是这种机制.具体为什么,请听我娓娓道来, ...
- C# 使用 DictionaryEntry 在WinForm中给 ComboBox 添加 Key 和 Value
C# 使用 DictionaryEntry 在WinForm中给 ComboBox 添加 Key 和 Value 1.DictionaryEntry 命名空间: System.Collec ...
- 除了FastJson,你也应该了解一下Jackson(二)
概览 上一篇文章介绍了Jackson中的映射器ObjectMapper,以及如何使用它来实现Json与Java对象之间的序列化和反序列化,最后介绍了Jackson中一些序列化/反序列化的高级特性.而本 ...
最新文章
- Android switchCompat. 和 Switch
- 给iOS开发者的React Native入门使用教程
- 从Vuex的Actions中理解JavaScript的解构赋值
- TLD(Tracking-Learning-Detection)学习与源码理解之(六)
- re正则表达式的使用
- mock以及特殊场景下对mock数据的处理
- 周末之个人杂想(四)
- Linux 添加计划任务
- modulenotfounderror python_python程序在命令行执行提示ModuleNotFoundError: No module named 'XXX' 解决方法...
- PointTrackNet:一种用于点云三维目标检测和跟踪的端到端网络
- Vmware安装Vmware Tools工具
- Windows磁盘格式、分区格式及类型
- 中兴android手机驱动,驱动天空 - 手机驱动 - 中兴手机 ZTE
- 应对风险和机会的措施讲解
- 读《从零开始学理财》
- Linux日志切割神器Logrotate的原理和配置详解,建议收藏!!!
- 2.15范冰增长黑客读书笔记
- 前端入门最全学习笔记--html
- iOS7人机界面指南 – ISUX原创翻译
- THU2015 fall 1-1 Team
热门文章
- 深度-图像风格变换【二】
- Java 解析 XML
- OpenCV3与深度学习实例-使用OpenPose进行人体姿态估算
- java中计时器的用法Timer和TimerTask的用法__java中利用Timer与TImerTask 计时器间隔执行任务...
- PowerDesigner 中的name与comment转换(转)
- 安卓项目之微信公众好---初体验
- 在有序数列里插入新元素(C语言)
- 关于读入带空格的字符串与输入输出重定向
- 信息学奥赛一本通 1130:找第一个只出现一次的字符 | OpenJudge NOI 1.7 02
- 信息学奥赛一本通 1100:金币 | 1969:【15NOIP普及组】金币 | OpenJudge NOI 1.5 45 | 洛谷 P2669 [NOIP2015 普及组] 金币