使用fastjson有个内存oom的问题,我们应该尽量使用jackjson,为什么呢?因为fastjson会引发一个oom,很潜在的危险,虽然jackjson的api真的非常好用,对于解析json串来说,简直到了出神入化的地步,但是对于这些工具来说,还是请相信外国的,中国的是只要作者一离职,就没人维护了。
 
如何使用:
其实对于jackjson有种不同的版本,jackjson1.x的
codehaus.jackson.vesion1.8.0codehaus.jackson.vesiondependency groupIdorg.codehaus.jacksongroupId artifactIdjackson-mapper-aslartifactId version${codehaus.jackson.vesion}versiondependencydependency groupIdorg.codehaus.jacksongroupId artifactIdjackson-core-aslartifactId version${codehaus.jackson.vesion}versiondependency一类是2.x的
jackson.version2.8.0jackson.versiondependency groupIdcom.fasterxml.jackson.coregroupId artifactIdjackson-databindartifactId version${jackson.version}versiondependencydependency groupIdcom.fasterxml.jackson.coregroupId artifactIdjackson-coreartifactId version${jackson.version}versiondependencydependency groupIdcom.fasterxml.jackson.coregroupId artifactIdjackson-annotationsartifactId version${jackson.version}versiondependencypublic class JsonUtils {
 
private static final Logger logger = LoggerFactory.getLogger(JsonUtils.class);
 
private static ObjectMapper objectMapper;
 
static {
objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.getSerializationConfig().setSerializationInclusion(JsonSerialize.Inclusion.NON_NULL);
 
 
}
这里是初始化一个ObjectMapper,并做些配置,下面就这三个配置坐下讲解:
DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES:在遇到类中没有的属性时,是否反序列化失败。这个很容易理解,有时候我们可能只需要json中的某几个属性,序列化到某个类中,那么多余的那些属性,在类中是没有定义的,而反序列化是根据类中属性的setter和getter来反序列化的,没有的属性自然也没有setter和getter,所以,如果不指明为false,那么就会反序列化失败,这里如果没有特殊的严格要求,还是设置为false。
SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS:对于Date类型,是否序列化为timestamps,这里控制的Date类型的属性,序列化的时候如何输出,默认为true,在2.x我们还可以通过
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
private Date date;
来指明序列化的时间格式。
JsonSerialize.Inclusion.NON_NULL:指明序列化的时候是否输出属性为null的字段,默认为
false
下面附上object2json json2object json2list json2map等几个常用的方法:
public static String object2Json(Object object) {
if (object == null) {
return "";
}
try {
return objectMapper.writeValueAsString(object);
 
} catch (Exception e) {
logger.info("object2Json exception. object:" + object.toString(), e);
return "";
}
}
 
/**
* json转换成java bean
* */
public static <T> T json2Object(String json, Class<T> clazz) {
if (StringUtils.isBlank(json)) {
return null;
}
try {
return objectMapper.readValue(json, clazz);
} catch (IOException e) {
logger.error("json2Object exception. json:" + json, e);
return null;
}
}
 
public static <T> List<T> toList(String json) {
try {
return objectMapper.readValue(json, List.class);
} catch (Throwable var2) {
logger.error("fs",var2);
return null;
}
}
 
public static <K,V> Map<K,V> toMap(String json) {
try {
return objectMapper.readValue(json, Map.class);
} catch (Throwable var2) {
logger.error("fs",var2);
return null;
}
}
以上是1.x的使用,下面是2.x的使用,具体配置 方法基本类似,但是在处理反序列化为list或者map的时候,是有些区别的。
public class JsonUtils {
 
private static final Logger logger = LoggerFactory.getLogger(JsonUtils.class);
 
private static ObjectMapper objectMapper;
 
static {
objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
 
}
这里的三个配置和1.x的配置含义一样,只是配置的方法有些变化。当然里面还有很多用用的配置,可以自己研究。
我们这里只附上2.x的json2list json2map,其他方法和1.x一样:
/**
* json转换成List<Object>
*
* */
public static <T> List<T> json2List(String json, Class<T> clazz) {
if (StringUtils.isBlank(json)) {
return Lists.newArrayList();
}
try {
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(ArrayList.class, clazz);
return objectMapper.readValue(json, javaType);
} catch (IOException e) {
logger.error("json2List exception. json:" + json, e);
return Lists.newArrayList();
}
}
 
/**
* json转换map<Object,Object>
* */
public static <K,V> Map<K,V> json2Map(String json, Class<K> keyClass, Class<V> valueClass) {
if (StringUtils.isBlank(json)) {
return Maps.newHashMap();
}
 
try {
JavaType javaType = objectMapper.getTypeFactory().constructParametricType(HashMap.class, keyClass, valueClass);
return objectMapper.readValue(json, javaType);
} catch (IOException e) {
logger.error("json2Map exception. json:" + json, e);
return Maps.newHashMap();
}
}
 
以上是1.x和2.x通过ObjectMapper进行序列化和反序列化的例子。注意,ObjectMapper是线程安全的,因此我们可以设置成static,只有一份就好。
 
1.x和2.x里都有一个JsonNode类,来具体获取某个json串里的某个字段,具体使用基本类似。我们下面只附上最简单的使用:
JsonNode jsonNode = objectMapper.readTree(userJson);
System.out.println(jsonNode.get("id").intValue());
System.out.println(jsonNode.get("username").textValue());
 
文章的结尾,附上和具体配置相关的链接:
 

fastjson转jackson的更多相关文章

  1. 【Json】fastjson与jackson常用操作记录

    本文只是记录fastjson.jackson一些常用的操作方法,没作比较,网上写比较的文章很多啦. 1.对象转Json串 // fastjson String objStr = JSON.toJSON ...

  2. JSON 解析 (三)—— FastJSON与Jackson比较

    一.方便性与性能 调用方便性而言: FastJSON提供了大量静态方法,调用简洁方便 Jackson须实例化类,调用相对繁琐,可通过封装成JSON工具类简化调用 性能而言: FastJSON反序列化的 ...

  3. 记一次FastJSON和Jackson解析json时遇到的中括号问题

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jadyer/article/details/24395015 完整版见https://jadyer. ...

  4. fastJson与jackson性能对比

    转载:https://blog.csdn.net/u013433821/article/details/82905222最近项目用到fastJson和jackson,为了决定到底弃用哪个,随手写了个测 ...

  5. java中使用fastjson、jackson、json-lib解析JSON-------------------妈妈再也不用担心JSON解析

    1.fastjson引入包<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjso ...

  6. Json 工具介绍 fastjson gson jackson

    1. fastjson fastjson是一个Java语言编写的高性能功能完善的JSON库.它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致, 是目前Java语言中最快的J ...

  7. spring boot 配置 fastjson 替代 Jackson (并解决返回字符串带双引号问题)

    注:以我遇到的情况,只要发出的请求参数是map格式的,都会在前后多加一个双引号 以下代码有两个功能:1.FastJson 替换 Spring 自带的 Jackson  2.解决返回的字符串带双引号问题 ...

  8. FastJson、Jackson、Gson进行Java对象转换Json细节处理

    前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...

  9. dubbox REST服务使用fastjson替换jackson

    上一节讲解了resteasy如何使用fastjson来替换默认的jackson,虽然dubbox内部采用的就是resteasy,但是大多数情况下,dubbox服务是一个独立的app,并不需要以war包 ...

  10. FastJson、Jackson、Gson进行Java对象转换Json的细节处理

    前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...

随机推荐

  1. node.js是用来做什么的

    Node.js 使用了一个事件驱动.非阻塞式 I/O 的模型,使其轻量又高效.(事件驱动:事件触发过程中,进行决策的一种策略,简单说就是跟随当前时间点上出现的事物,调用可用的资源进行解决该事物,使得不 ...

  2. Naive RNN vs LSTM vs GRU、attention基础

    原文地址:https://www.jianshu.com/p/b8653f8b5b2b 一.Recurrent Neural Network 二.Naive RNN Naive RNN更新参数时易出现 ...

  3. react map循环数据 死循环

    项目条件:react es6 antidesign 已在commonState中获取到list,但是在循环map填充DOM的时候陷入死循环. 原因:因为是子组件 ,在父组件请求数据的时候 有个时差过程 ...

  4. 第二记 Java数据类型

    一.数据类型 java中数据类型分为基本数据与引用数据类型两大类,其中又有更细致的划分,下面以图展示 二.基本数据类型封装类 Java是一门面向对象的语言,但是在一些情况下基本数据类型无法满足Java ...

  5. 记一次vue 普通异步请求微信二进制二维码 乱码 问题解决然后渲染

    后端压力大,前端分忧. /*用微信小程序token拿二维码*/ async fetchMINIQRcode({commit,state},params){ var instance = axios.c ...

  6. 小白如何在Windows下使用Redis

    一.redis下载按装  Nuget 可以直接下载 redis 将下来的包拷贝到自已需要的目录如我放到桌面文件夹“近期需要\Redis应用\redis-64.3.0.503” 操作 cmd进入命令操作 ...

  7. linux fcntl 对文件描述符控制

    linux fcntl 对文件描述符控制 linux fcntl 对文件描述符控制 linux fcntl 对文件描述符控制

  8. Mybatis中$和#取数据的区别

    Mybatis配置中,取出map入参的数据一般有两种方式#{key}和${key},下面是这两种取值的区别: 以同样的语句做对比: <select id="geUserByParam1 ...

  9. 自定义实现系统max方法

    function MyMath(){ //添加了一个方法 this.getMax=function(){ //所有数字中的最大值 var max=arguments[0]; for(var i=0;i ...

  10. 使用Fiddler抓取手机包

    配置Fiddler 设置抓取HTTPS包 允许为外部连接 配置移动端 移动端需要能够连接到主机做代理, 设置移动端的网络, 端口为Fiddler的端口, 然后给移动端安装证书, 访问主机名+代理端口号 ...