使用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());
文章的结尾,附上和具体配置相关的链接:
- 【Json】fastjson与jackson常用操作记录
本文只是记录fastjson.jackson一些常用的操作方法,没作比较,网上写比较的文章很多啦. 1.对象转Json串 // fastjson String objStr = JSON.toJSON ...
- JSON 解析 (三)—— FastJSON与Jackson比较
一.方便性与性能 调用方便性而言: FastJSON提供了大量静态方法,调用简洁方便 Jackson须实例化类,调用相对繁琐,可通过封装成JSON工具类简化调用 性能而言: FastJSON反序列化的 ...
- 记一次FastJSON和Jackson解析json时遇到的中括号问题
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/jadyer/article/details/24395015 完整版见https://jadyer. ...
- fastJson与jackson性能对比
转载:https://blog.csdn.net/u013433821/article/details/82905222最近项目用到fastJson和jackson,为了决定到底弃用哪个,随手写了个测 ...
- java中使用fastjson、jackson、json-lib解析JSON-------------------妈妈再也不用担心JSON解析
1.fastjson引入包<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjso ...
- Json 工具介绍 fastjson gson jackson
1. fastjson fastjson是一个Java语言编写的高性能功能完善的JSON库.它采用一种“假定有序快速匹配”的算法,把JSON Parse的性能提升到极致, 是目前Java语言中最快的J ...
- spring boot 配置 fastjson 替代 Jackson (并解决返回字符串带双引号问题)
注:以我遇到的情况,只要发出的请求参数是map格式的,都会在前后多加一个双引号 以下代码有两个功能:1.FastJson 替换 Spring 自带的 Jackson 2.解决返回的字符串带双引号问题 ...
- FastJson、Jackson、Gson进行Java对象转换Json细节处理
前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...
- dubbox REST服务使用fastjson替换jackson
上一节讲解了resteasy如何使用fastjson来替换默认的jackson,虽然dubbox内部采用的就是resteasy,但是大多数情况下,dubbox服务是一个独立的app,并不需要以war包 ...
- FastJson、Jackson、Gson进行Java对象转换Json的细节处理
前言 Java对象在转json的时候,如果对象里面有属性值为null的话,那么在json序列化的时候要不要序列出来呢?对比以下json转换方式 一.fastJson 1.fastJson在转换java ...
随机推荐
- 9、TestNG介绍与安装
介绍 TestNG是一个受JUnit和NUnit启发的测试框架,但引入了一些新功能,使其更加强大和易于使用,例如: 注释. 在任意大的线程池中运行你的测试,这些线程池有各种可用的策略(所有方法在他们自 ...
- 剑指offer第二版面试题8:用两个栈实现队列(JAVA版)
题目:用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能. 分析: 我们通过一个具体的例子来分析 ...
- ssh 登陆免 known_hosts 提示
修改配置文件 “~/.ssh/config”,加上这两行,重启服务器: StrictHostKeyChecking no UserKnownHostsFile /dev/null
- 剑指offer——40字符串的排列
题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输 ...
- java.lang.Boolean.compareTo()方法实例
compareTo接口 Comparable<Boolean>指定以下接口 参数 b - 布尔实例进行比较 返回值 方法返回 0 - 如果该对象表示相同的布尔值作为参数 一个正数值 - 如 ...
- leetcode.字符串.14最长公共前缀-Java
1. 具体题目 编写一个函数来查找字符串数组中的最长公共前缀.如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","fl ...
- SB般的“WE战队”输掉了比赛
事实再一次证明,对于LOL这种游戏,国服选手是根本就不能有一点期待的, 国服环境太好了,赢了可以吹,输了不能骂,自信心极度膨胀,估计WE俱乐部都没有个心理咨询师, 下岗了还可以再卖卖脸,卖卖饼, 国服 ...
- xxd - 以十六进制形式表示
总览 (SYNOPSIS) xxd -h[elp] xxd [options] [infile [outfile]] xxd -r[evert] [options] [infile [outfile] ...
- Centos7 PXE Server Install Script
#安装前配置好centos和epel yum源 #网卡ip和localip一致 localip="192.168.88.200" eth_name='eth0' dnsmasq_i ...
- PL/SQL Developer 查看查询的执行计划
https://zhuanlan.zhihu.com/p/65771352 通过 PL/SQL Developer 查看查询的执行计划 1 什么是执行计划 执行计划是一条查询语句在 Oracle 中的 ...