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);

评论

评论加载中……