当前位置: 首页 > 后端技术 > Java

获取Jackson序列化和常用注解

时间:2023-04-01 22:34:20 Java

简介Jackson是一套Java的数据处理工具,包括一流的JSON解析/生成库、匹配数据绑定库(用于类和JSON字符串之间的转换)、以及其他数据格式处理Avro、BSON、CBOR、CSV、Smile、(Java)Properties、Protobuf、XML或YAML编码数据的模块。三个核心模块Streaming(jackson-corepackage):定义了底层的streamingAPI,包括具体json的实现。注释(jackson-annotations包):包含标准的Jackson注释。Databind(jackson-databind包):实现数据绑定,依赖于Streaming和Annotations。(导入jackson-databind包会自动导入另外两个包)什么是序列化和反序列化Serialization(序列化):JSON对象->JSON字符串Deserialization(反序列化):JSON字符串->JSON对象Jackson序列化与反序列化Jackson序列化公共属性和默认的getter方法,所以如果是公共属性,就不需要getter方法,但是如果是私有属性,就需要标准的getter方法。Jackson反序列化了公共属性和getter方法,所以如果是公共属性,则不需要setter方法,但如果是私有属性,则需要标准的setter方法。当Jackson反序列化时,它默认使用无参数构造函数来创建对象。引入依赖一般情况下,com.fasterxml.jackson.corejackson-databind2.11.1引入jackson-databind它将关联jackson-annotations和jackson-core。SpringBoot下的spring-boot-starter-web包自带了jackson的核心类库,无需手动导入。ObjectMapper使用Jackson中的ObjectMapper对象进行序列化和反序列化操作。下面以Car作为类进行操作演示:publicclassCar{privateStringcolor;私有字符串类型;//标准getterssetters}序列化操作ObjectMapperobjectMapper=newObjectMapper();Carcar=newCar("yellow","renault");objectMapper.writeValue(newFile("target/car.json"),car);//序列化到文件StringcarAsString=objectMapper.writeValueAsString(car);//序列化成String反序列化操作JSON反序列化成JavaObjectStringjson="{\"color\":\"yellow\",\"type\":\"renault\"}";ObjectMappermapper=newObjectMapper();Carcar=mapper.readValue(json,Car.class);JSON反序列化成Jackson的JsonNodetypeStringjson="{\"color\":\"yellow\",\"type\":\"renault\"}";ObjectMappermapper=newObjectMapper();JsonNodejsonNode=mapper.readTree(json);Stringtype=jsonNode.get("type").asText();将JSNO数组反序列化为JavaList类型//方法一(推荐)StringjsonCarArray="[{\"color\":\"Black\",\"type\":\"BMW\"},{\"color\":\"Red\",\"type\":\"FIAT\"}]";ListlistCar=objectMapper.readValue(jsonCarArray,newTypeReference>(){});//方法2StringjsonCarArray="[{\"color\":\"Black\",\"type\":\"BMW\"},{\"color\":\"Red\",\"type\":\"FIAT\"}]";objectMapper.configure(DeserializationFeature.USE_JAVA_ARRAY_FOR_JSON_ARRAY,true);Car[]cars=objectMapper.readValue(jsonCarArray,Car[]。班级);JSON反序列化成Map类型Stringjson="{\"color\":\"Black\",\"type\":{\"a\":22},\"arr\":[\"aa\",\"bb\"]}";Mapmap=newObjectMapper().readValue(json,newTypeReference>(){});System.out.println("map="+map);Stringcolor=(String)map.get("color");System.out.println("color="+color);Maptype=(Map)map.get("type");Integera=(Integer)type.get("a");System.out.println("a="+a);Listarr=(List)map.get("arr");System.out.println("arr="+arr);杰克逊注解按功能分为杰克逊注解,并给出简要的文字说明具体的注解使用示例可以参考文章Jackson注解实例Jackson的序列化注解@JsonAnyGetter:作用于Map字段的getter方法,可以将Map字段中的键值对序列化为类的标准属性。例如:@JsonAnyGetter@JsonGetter:将方法标记为getter方法是@JsonProperty的替代方法。例如:@JsonGetter("name")@JsonPropertyOrder:指定属性在序列化时的顺序。例如:@JsonPropertyOrder({"name","id"}),@JsonPropertyOrder(alphabetic=true)@JsonRawValue:指定的属性以原生字符串的形式序列化,即不会对字符串进行转义,如果需要,在嵌入Json字符串时很有用。例如:@JsonRawValue@JsonValue:指定使用一个方法序列化整个实例。例如:@JsonValue@JsonRootName:启用SerializationFeature.WRAP_ROOT_VALUE时,用于指定被包装实体的名称。例如:@JsonRootName(value="user")@JsonSerialize:表示在序列化时使用指定的自定义序列化器。例如:@JsonSerialize(using=CustomDateSerializer.class)Jackson的反序列化注解@JsonCreator:作用于类的构造函数或工厂方法,表示用于反序列化生成的对象,当JSON与实体。例如:@JsonCreator@JacksonInject:表示该属性将从注入中获取其值,而不是从JSON数据中获取。例如:@JacksonInject@JsonAnySetter:表示反序列化时可以用Map接收未知属性。例如:@JsonAnySetter@JsonSetter:将方法标记为setter方法,是@JsonProperty的替代方法。当JSON与属性值不匹配时很有用。例如:@JsonSetter("name")@JsonDeserialize:表示使用自定义反序列化器。例如:@JsonDeserialize(using=CustomDateDeserializer.class)@JsonAlias:在反序列化过程中为属性定义一个或多个可选名称。例如:@JsonAlias({"fName","f_name"})Jackson的属性包含注解@JsonIgnoreProperties:类级别的注解,表示在序列化和反序列化时会忽略某些类的字段。有一个ignoreUnknown配置。当它为真时,反序列化期间的未知属性将被忽略。默认为false,即有未知属性时会抛出异常。例如:@JsonIgnoreProperties(value={"id"},ignoreUnknown=true)@JsonIgnore:字段级注解,表示该字段将被Jackson忽略。例如:@JsonIgnore@JsonIgnoreType:类级别的注解,表示该类的所有字段都会被Jackson忽略。例如:@JsonIgnoreType@JsonInclude:可以用来在反序列化时排除具有null/empty/default值的属性。例如:@JsonInclude(value=JsonInclude.Include.NON_NULL)@JsonAutoDetect:您可以更改默认字段可见性。默认情况下,私有字段不可见。例如:@JsonAutoDetect(fieldVisibility=Visibility.ANY)@JsonTypeInfo、@JsonSubTypes、@JsonTypeName:用于处理多态性的注解。Jackson的通用注解@JsonProperty:用于指定序列化和反序列化的属性名映射。例如:@JsonProperty("name")@JsonFormat:指定序列化和反序列化日期/时间值时的格式。默认时区是格林威治标准时间。例如:@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")@JsonUnwrapped:表示对象在序列化/反序列化时应该被解包。例如:@JsonUnwrapped@JsonView:可用于序列化/反序列化过程中的字段可见性问题。@JsonManagedReference、@JsonBackReference:可以用来处理循环依赖。@JsonIdentityInfo:可以用来处理循环依赖问题。@JsonFilter:序列化时指定Filter。@JacksonAnnotationsInside:用于自定义注释。JacksonFeature常用Jacksonfeature开关:DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES:反序列化时如果有未知属性则失败。默认是。SerializationFeature.WRAP_ROOT_VALUE:指定序列化时包装根对象。默认为否。MapperFeature.USE_ANNOTATIONS:使用注解,默认为。可以使用mapper的configure()、enable()、disable()来配置feature,例如:ObjectMappermapper=newObjectMapper();mapper.disable(SerializationFeature.WRAP_ROOT_VALUE);mapper.disable(MapperFeature.USE_ANNOTATIONS);@JsonFormat@DateTimeFormat和@JsonFormat之间的区别是一个Jackson注释,它指定了JSON序列化和反序列化日期/时间值时的格式。由于杰克逊的默认时区是格林威治标准时间,而我们在东八区,时间会比我们实际想要的时间少八个小时,所以我们需要设置指定时区:@JsonFormat(pattern="yyyy-MM-ddHH:mm:ss",timezone="GMT+8")在SpringBoot中,可以通过配置文件统一配置时间格式和时区//配置文件统一配置spring.jackson.date-format=yyyy-MM-ddHH:mm:ssspring.jackson.time-zone=GMT+8@DateTimeFormat是一个Spring注解,用于将Get请求中URL路径中的参数格式化为Date类型。不能指定时区,默认为当前时区@DateTimeFormat(pattern="yyyy-MM-ddHH:mm:ss")参考官方介绍网站官方文档网站jackson快速入门baeldung英文教程