使用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 ...
随机推荐
- SPSS聚类分析:K均值聚类分析
SPSS聚类分析:K均值聚类分析 一.概念:(分析-分类-K均值聚类) 1.此过程使用可以处理大量个案的算法,根据选定的特征尝试对相对均一的个案组进行标识.不过,该算法要求您指定聚类的个数.如果知道, ...
- CSS实现背景图片固定
body { background-image:url('bg.jpg'); background-repeat: no-repeat; background-attachment: fixed; / ...
- Ethenet: MAC PHY MII RMII
https://www.cnblogs.com/liangxiaofeng/p/3874866.html 1. general 下图是网口结构简图.网口由CPU.MAC和PHY三部分组成.DMA控制器 ...
- 6.1.2 The continuous assignment statement
Frm: IEEE Std 1364™-2001, IEEE Standard Verilog® Hardware Description Language The continuous assign ...
- maven surefire入门
一.maven常用命令: mvn compile mvn install mvn test mvn clean mvn dependency:resolve -X #查看完整的debug信息!!! ...
- 剑指offer——58数组中数值和下标相等的元素
题目三: 数组中数值和下标相等的元素. 假设一个单调递增的数组里的每个元素都是整数并且是唯一的.请编程实现一个函数,找出数组中任意一个数值等于其下标的元素.例如,在数组{-3,-1,1,3,5}中,数 ...
- Jackson环境安装设置
本地环境设置 由于Jackson是基于Java编程语言的,所以需要设置Java开发环境,这里介绍如何下载安装设置Java.请按照以下步骤来设置环境. Java SE是免费的,点击下载链接:下载Java ...
- mongo之$max
原集合: { _id: 1, highScore: 800, lowScore: 200 } 应用: #意思是:更新_id 等于1 的记录,条件是highScore 950>原纪录的highSc ...
- PHP操作XML方法之SimpleXML
SimpleXML简介 SimpleXML 扩展提供了一个非常简单和易于使用的工具集,能将XML转换成一个带有一般属性选择器和数组迭代器的对象. 举例XML XML结构部分引用自<<深入理 ...
- 笔记45 Hibernate快速入门(二)
Hibernate O/R 映射 一.多对一 一个Product对应一个Category,一个Category对应多个Product,所以Product和Category是多对一的关系.使用hiber ...