Jackson
Jackson的使用需要借助ObjectMapper类来进行序列化和反序列化,其中序列化使用writeValu…
Jackson的使用需要借助ObjectMapper类来进行序列化和反序列化,其中序列化使用writeValueAsString,
反序列化用readValue
备注
ObjectMapper是线程安全的!
xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.2</version>
</dependency>序列化
public static final ObjectMapper objectMapper=new ObjectMapper();
public static void main(String[] args) throws JsonProcessingException {
Main main = Main.of("zhanSan", new Date(), MainInfo.of(1, "infoMsg"));
System.out.println(objectMapper.writeValueAsString(main));
}Main.java
java
@Data
@AllArgsConstructor(staticName = "of")
public class Main {
private String name;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date birthday;
private MainInfo info;
}其中JsonFormat注解用于标注日期格式化
使用:
-
只包含非null属性
全局配置 //序列化时只包含非空属性 static { objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); } 单个对象配置(使用注解) @JsonInclude(JsonInclude.Include.NON_NULL) public class Main { } -
日期时间格式化输出
单个配置 @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 全局配置(针对Date) objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); 注意!:SimpleDateFormat是线程不安全的,建议不要这么弄
转化JAVA8的时间的时候可能会有问题
注意
Java 8 date/time type java.time.LocalDateTime not supported by default: add Module “com.fasterxml.jackson.datatype:jackson-datatype-jsr310” to enable handling (through reference chain: fun.maluyao.pojo.Main[“localDate”])
解决方案:
1、添加依赖
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.17.2</version>
</dependency>这个以来是用来兼容Java8的时间格式的,对LOcalDateTime等jdk8时间日期api的转化支持
2、enable handling
//自动通过spi发现Jackson的module并注册
objectMapper.findAndRegisterModules();
//手动配置JavaTimeModule并注册
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
objectMapper.registerModule(javaTimeModule);-
美化输出
objectMapper.configure(SerializationFeature.INDENT_OUTPUT,true);
反序列化
-
忽略不存在的key 反序列化的时候json中存在类不存在的属性时会报错,需要配置
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,false); 或者: objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES); -
泛型处理
List<Main> value = objectMapper.readValue(json, new TypeReference<List<Main>>() {});通用配置
- 指定属性名和json字符串key的对应关系(使用注解
@JsonProperty)
@JsonProperty("no")
private String name;- 忽略的属性
@JsonIgnore
private Date birthday;其他应用
- 对象更新(后者有的属性覆盖,其他值和前者一样不变)
Object obj=objectMapper.updateValue(oldObject,newObject);评论
评论加载中……