因为fastjson反序列化存在安全漏洞

所以公司项目决定使用jackson代替fastjson

简介

Jackson是一个简单基于Java应用库,Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json、xml转换成Java对象。Jackson所依赖的jar包较少,简单易用并且性能也要相对高些,并且Jackson社区相对比较活跃,更新速度也比较快。

Jackson 的核心模块由三部分组成:
jackson-core,核心包
jackson-annotations,注解包
jackson-databind ,数据绑定包

使用

引入依赖

        <!--Jackson required包-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.10.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.10.2</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.10.2</version>
        </dependency>

在springboot中使用
一般在项目中使用,会将方法封装在工具类里面


```java
public class CommonUtil {
    // 默认jackson对象
    private static ObjectMapper defaultObjectMapper = new ObjectMapper();

    //根据项目需要自定义配置
    static {
        defaultObjectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)//解决SerializationFeature.FAIL_ON_EMPTY_BEANS异常
                .setSerializationInclusion(JsonInclude.Include.NON_NULL)//属性值为null的不参与序列化
                .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);//反序列化时忽略对象中不存在的json字段
    }
    
    //将字符串转成对象
    public static <T> T parseObject(String text, Class<T> clazz) {
        T obj = null;
        if (!StringUtils.isEmpty(text)) {
            try {
                obj = defaultObjectMapper.readValue(text, clazz);
            } catch (IOException e) {
                log.error(e.getMessage(), e);
            }
        }
        return obj;
    }
    
 	 /**
     * @Description  字符串转ObjectNode
     **/
    public static ObjectNode toObjectNode(String text) {
        ObjectNode objectNode = null;
        if (!StringUtils.isEmpty(text)) {
            try {
                objectNode = (ObjectNode) defaultObjectMapper.readTree(text);
            } catch (IOException e) {
                log.error(e.getMessage(), e);
            }
        }
        return objectNode;
    }

    /**
     * 对象转json
     * @param object
     * @return
     */
    public static String toJSONString(Object object) {
        String res = null;
        try {
            res = defaultObjectMapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            log.error(e.getMessage(), e);
        }
        return res;
    }

//这里仅贴出常用方法,大家可以根据自己需求进行封装
}

方法详解

这里会列出常用方法的详解,更多方法可查阅jackson api文档

ObjectMapper类是Jackson库的主要类。它提供一些功能将转换成Java对象匹配JSON结构

  • 对象转json字符串

ObjectMapper 通过 writeValue 系列方法将 java 对象序列化为 json,并将 json 存储成不同的格式:String(writeValueAsString)、Byte Array(writeValueAsBytes)、Writer、File、OutStream、DataOutput。
ObjectMapper objectMapper = new ObjectMapper();构造ObjectMapper对象

objectMapper.writeValue(参数,obj);
//参数解析:
//File: 将对象转为json字符串,保存到指定的文件中
//Writer: 将对象转为json字符串,并将json数据填充到字符输出流中
// outputStream: 将对象转为json字符串,并将json数据填充到字节输出流中

objectMapper.writeValueAsString(obj)//将对象转为json字符

objectMapper.writeValueAsBytes(obj)//将对象转为json字符(byte数据格式)

SimpleDateFormat dateFormat = new SimpleDateFormat(“yyyy-MM-dd”);
objectMapper.setDateFormat(dateFormat);//支持时间转换成格式化的字符串

  • 字符串转对象

ObjectMapper 通过 readValue 系列方法从不同的数据源: String、Byte Array、Reader、File、URL、InputStream 中反序列化为 java 对象。

Obj obj = objectMapper.readValue(参数, Obj.class);//json转对象
//参数可以是String,Reader,URL,File,InputStream ,Byte

  • json Tree模型
    JsonNode 抽象类
    ObjectNode 继承 JsonNode,可代替fastjson的JSONObject
    ArrayNode 继承 JsonNode,可代替fastjson的JSONArray

JsonNode对象是不可变的,所以不能直接构建JsonNode实例的对象图,可以通过创建JsonNode 的子类ObjectNode实例的对象图

// JsonNode 对象
JsonNode jsonNode = objectMapper.readTree(json);

//ObjectNode对象
ObjectNode objectNode = objectMapper.createObjectNode();
objectNode.put(" “,” “);
objectNode.remove(” ");

//ObjectNode对象
ArrayNode arraynode = mapper.createArrayNode();

常用注解

  1. @JsonIgnore 作用域属性或方法上
    @JsonIgnore 用来告诉 Jackson 在序列化/反序列化时忽略该注解标注的 java pojo 属性
    @JsonIgnore
    private String name;
  1. @JsonIgnoreProperties 作用在类上
    @JsonIgnoreProperties 和 @JsonIgnore 的作用相同,都是告诉 Jackson 该忽略哪些属性,
    不同之处是 @JsonIgnoreProperties 是类级别的,并且可以同时指定多个属性。
@JsonIgnoreProperties(value = {"字段1","字段2"})
public class Xxxx{。。。}
  1. @JsonIgnoreType
    @JsonIgnoreType 标注在类上,当其他类有该类作为属性时,该属性将被忽略
@JsonIgnoreType
public class Xxxx{。。。}
  1. @JsonProperty
    @JsonProperty 可以指定某个属性和json映射的名称。例如我们有个json字符串为{“user_name”:”xxxx”},
    而java中命名要遵循驼峰规则,则为userName,这时通过@JsonProperty 注解来指定两者的映射规则即可。这个注解也比较常用。
@JsonProperty("user_name")
private String userName;
  1. @JsonInclude
    在将 java pojo 对象序列化成为 json 字符串时,使用 @JsonInclude 注解可以控制在哪些情况下才将被注解的属性转换成 json,例如只有属性不为 null 时。
@JsonInclude(JsonInclude.Include.NON_NULL)
private String username;

常用用法:
JsonJsonInclude.Include.ALWAYS 这个是默认策略,任何情况下都序列化该字段,和不写这个注解是一样的效果。
JsonJsonInclude.Include.NON_NULL 这个最常用,即如果加该注解的字段为null,那么就不序列化这个字段了。
JsonJsonInclude.Include.NON_ABSENT 这个包含NON_NULL,即为null的时候不序列化
JsonJsonInclude.Include.NON_DEFAULT 如果字段是默认值的话就不序列化。

Logo

鸿蒙生态一站式服务平台。

更多推荐