使用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 ...
随机推荐
- 常用的HTTP请求头与响应头
HTTP消息头是指,在超文本传输协议( Hypertext Transfer Protocol ,HTTP)的请求和响应消息中,协议头部分的那些组件.HTTP消息头用来准确描述正在获取的资源.服务器或 ...
- Intel Pin基础
参考:http://software.intel.com/sites/landingpage/pintool/docs/62732/Pin/html/ http://blog.nruns.com/bl ...
- Day 19:面向对象【类方法】静态属性/静态属性/类方法
静态属性 @property class Mom: gender = "woman" def __init__(self,name,weight): self.name = n ...
- Spark中的多线程并发处理
Spark中的多任务处理 Spark的一个非常常见的用例是并行运行许多作业. 构建作业DAG后,Spark将这些任务分配到多个Executor上并行处理.但这并不能帮助我们在同一个Spark应用程序中 ...
- js 点击获取验证码后的倒数60s
<!DOCTYPE html> <html> <head> <meta charset="UTF-8" /> <script ...
- 39-Ubuntu-用户管理-04-usermod设置主组和附加组
主组:通常在新建用户时指定,在/etc/passwd的第4列GID显示主组名. 附加组:在/etc/group中最后一列显示该组的用户列表,用于指定用户的附加权限. 1.修改用户的主组 sudo us ...
- C语言结构体嵌套
#include <stdio.h> int main() { /*************************************************** *结构体嵌套:结构 ...
- 30个优秀的CSS技术和实例 By 彬Go 2008-12-04
在这里可发现很多与众不同的技术,比如:图片集.阴影效果.可扩展按钮.菜单等…这些实例都是使用纯CSS和HTML实现的.单击每个实例的标题可以被转向到该技术实例的相关教程或说明页面(英文),单击每个实例 ...
- Oracle之视图联合查询加排序问题
在公司修改bug,有这样的需求:需要从两张视图中查出相同字段的数据,按照导师姓名先排序,再按照学号排序 union联合两张表,SELECT * from((SELECT DS_ID,PYLX_ID,Y ...
- windows 修改远程登录端口号
运行regedit.exe打开注册表编辑器,即在cmd的dos窗口输入regedit命令 找到如下注册表子项: HKEY_LOCAL_MACHINE\System\CurrentControlSet\ ...