zoukankan      html  css  js  c++  java
  • fastjson转jackson

    使用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());
     
    文章的结尾,附上和具体配置相关的链接:
     
  • 相关阅读:
    栈大小和内存分部问题
    inline和宏之间的区别
    两个栈实现双端队列
    Hibernate学习笔记-Hibernate关系映射
    Hibernate学习笔记-Hibernate HQL查询
    Hibernate学习笔记--第一个Hibernate框架程序
    Hibernate学习笔记--Hibernate框架错误集合及解决
    Java学习笔记--对象克隆
    Scala学习笔记--文件IO
    Java学习笔记--Socket和ServerSocket
  • 原文地址:https://www.cnblogs.com/yuebintse/p/6117712.html
Copyright © 2011-2022 走看看