因为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();
常用注解
- @JsonIgnore 作用域属性或方法上
@JsonIgnore 用来告诉 Jackson 在序列化/反序列化时忽略该注解标注的 java pojo 属性
@JsonIgnore
private String name;
- @JsonIgnoreProperties 作用在类上
@JsonIgnoreProperties 和 @JsonIgnore 的作用相同,都是告诉 Jackson 该忽略哪些属性,
不同之处是 @JsonIgnoreProperties 是类级别的,并且可以同时指定多个属性。
@JsonIgnoreProperties(value = {"字段1","字段2"})
public class Xxxx{。。。}
- @JsonIgnoreType
@JsonIgnoreType 标注在类上,当其他类有该类作为属性时,该属性将被忽略
@JsonIgnoreType
public class Xxxx{。。。}
- @JsonProperty
@JsonProperty 可以指定某个属性和json映射的名称。例如我们有个json字符串为{“user_name”:”xxxx”},
而java中命名要遵循驼峰规则,则为userName,这时通过@JsonProperty 注解来指定两者的映射规则即可。这个注解也比较常用。
@JsonProperty("user_name")
private String userName;
- @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 如果字段是默认值的话就不序列化。