json反序列化注意的问题,json序列化与反序列化

  json反序列化注意的问题,json序列化与反序列化

  00-1010控制json序列化/反序列化1。@ jsonignoreproperties 2的用法。@JsonProperty注释3。@JsonCreator注释4。@JsonSetter和@JsonGetter注释5。@ JSONNYSetter注释6。@ JSONNYGetter注释7。@JsonForm评论在8。@JsonSerialize和@ jsonserialize评论SpringBoot序列化规则1。全局设置2。本地设置3。自定义本地序列化4。自定义全局空转换序列化

  

目录

 

  00-1010 @ jsonignoreproperties(value={ prop 1 , prop2})用于修改Pojo类。序列化和反序列化时,可以忽略指定的属性,也可以忽略一个或多个属性。

  @ jsonignoreproperties(ignore unknown=true)用于修饰Pojo类,忽略那些在反序列化过程中无法设置的属性,包括那些无法在构造函数和对应的setter方法中设置的属性。

  00-1010如果json字段名称与Pojo的属性名称不一致,可以用@JsonProperty注释getter()或setter()方法,设置json对应的属性名称。另外,@JsonProperty常用来注释构造函数的参数,构造函数要用@JsonCreator来注释。

  00-1010如果Pojo类定义了一个带参数的构造函数,但是没有提供参数构造函数,那么在反序列化过程中将会报错。有两种方法:3360

  方法一:添加一个无参数的构造函数方法二:给这个带参数的构造函数添加@JsonCreator批注,参数需要用@JsonProperty批注进行批注。

  00-1010如果json字段名称与Pojo的属性名称不一致,可以使用@JsonGetter来注释Getter()和@JsonSetter来注释Setter()方法。两种注释都可以指定一个属性名。这两种注释都可以用@JsonProperty替换。

  

控制json序列化/反序列化

通用对象属性名称是确定的。例如,汽车对象具有诸如品牌/价格等命名属性,但有时我们需要为汽车对象设置一些扩展属性。这些扩展属性的名称暂时不确定,通常使用MapString。字符串来存储这些扩展属性的K/V。要将json数据中的这些属性反序列化到类映射中,需要在类上添加一个K/V setter方法,这个setter方法要用@JsonAnySetter进行注释。

 

  公级车{公串品牌;私有MapString,字符串属性。@ JsonAnySetter public void add(String key,String value){ properties . put(key,value);}}一旦@JsonAnySetter被添加到类中,下面的json数据可以被反序列化到Map 3360中

  {brand:Benz , attr2:val2 , attr1:val1}

  00-1010对应@JsonAnySetter的注释。如果要将类中的Map K/V属性序列化到json中,需要在类上添加一个@JsonAnyGetter方法,可以直接返回KV map。

  公级车{公串品牌;私有MapString,字符串属性。@ JsonAnyGetter公共MapString,String getProperties() { ret

  urn properties;    }}序列化后的json为:

  

{"brand":"Benz","attr2":"val2","attr1":"val1"}

 

  

7. @JsonFormat 注解

通常明确Date/Time 属性序列化用的时间格式.

 

  

public class Event {    public String name;     @JsonFormat(      shape = JsonFormat.Shape.STRING, pattern = "dd-MM-yyyy hh:mm:ss")    public Date eventDate;}

 

  

8.@JsonSerialize 和 @JsonDeserialize 注解

@JsonSerialize注解可以为类属性设定专门的序列化函数, @JsonDeserialize注解用来为json属性定制化反序列化函数

 

  

 

  

SpringBoot序列化规则

Include.Include.ALWAYS 默认Include.NON_DEFAULT 属性为默认值不序列化Include.NON_EMPTY 属性为 空() 或者为 NULL 都不序列化Include.NON_NULL 属性为NULL 不序列化

 

  

1.全局设置

/** * 〈返回json空值去掉null和""〉 〈功能详细描述〉 * * @author gogym * @version 2017年10月13日 * @see JacksonConfig * @since */@Configurationpublic class JacksonConfig{ @Bean @Primary @ConditionalOnMissingBean(ObjectMapper.class) public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); // 通过该方法对mapper对象进行设置,所有序列化的对象都将按改规则进行系列化 // Include.Include.ALWAYS 默认 // Include.NON_DEFAULT 属性为默认值不序列化 // Include.NON_EMPTY 属性为 空("") 或者为 NULL 都不序列化,则返回的json是没有这个字段的。这样对移动端会更省流量 // Include.NON_NULL 属性为NULL 不序列化,就是为null的字段不参加序列化 //objectMapper.setSerializationInclusion(Include.NON_EMPTY); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY); return objectMapper; }}

或者

 

  

spring.jackson.default-property-inclusion=non_nullspring: jackson: default-property-inclusion: non_null

 

  

2.局部设置

在需要设置的实体类或者字段上加上注解

 

  

@JsonInclude(Include.NON_NULL)

 

  

3.自定义局部序列化

(1)、自定义一个序列化工具类,需要实现StdSerializer<T>或者JsonSerializer<T>

 

  

public class ClientObjectSerialize extends JsonSerializer<CreditBorrowerRepaymentRequestDto>{ @Override public void serialize(CreditBorrowerRepaymentRequestDto dto, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException { jsonGenerator.writeStartObject(); try { Field[] fields = dto.getClass().getDeclaredFields(); for (Field field : fields) { field.setAccessible(true); if(null == field.get(dto)){ continue; } jsonGenerator.writeFieldName(field.getName()); jsonGenerator.writeObject(field.get(dto)); } } catch (Exception e) { e.printStackTrace(); } jsonGenerator.writeEndObject(); }}

(2)使用注解作用在实体类上

 

  

@JsonSerialize(using = ClientObjectSerialize.class)public class CreditBorrowerRepaymentRequestDto{}

(3)可以作用在实体对象字段上,对NULL值的处理,或者转换

 

  

@JsonSerialize(using = ClientStringSerialize.class)private String name; @JsonSerialize(using = ClientDtaeSerialize.class)private Date date;public class ClientStringSerialize extends JsonSerializer<String> { @Override public void serialize(String string, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { if(string == null){ jsonGenerator.writeString(string + "[NULL]"); }else{ jsonGenerator.writeString(string); } }} public class ClientDtaeSerialize extends JsonSerializer<Date> { @Override public void serialize(Date createDate, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeString(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(createDate)); }}

 

  

4.自定义全局 null 转换 序列化

SpringBoot返回Json数据中null值处理,将字符串类型null值转换为"",将集合数组类型null值转换为[],将原始数据类型null值转换为0,将布尔类型null值转换为false,将实体对象null值转换为{}。

 

  (1)自定义null值序列化处理器

  

import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.databind.JsonSerializer;import com.fasterxml.jackson.databind.SerializerProvider;import java.io.IOException;/** * 自定义null值序列化处理器 */public class CustomizeNullJsonSerializer { /** * 处理数组集合类型的null值 */ public static class NullArrayJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeStartArray(); jsonGenerator.writeEndArray(); } } /** * 处理字符串类型的null值 */ public static class NullStringJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeString(""); } } /** * 处理数值类型的null值 */ public static class NullNumberJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeNumber(0); } } /** * 处理boolean类型的null值 */ public static class NullBooleanJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeBoolean(false); } } /** * 处理实体对象类型的null值 */ public static class NullObjectJsonSerializer extends JsonSerializer<Object> { @Override public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { jsonGenerator.writeStartObject(); jsonGenerator.writeEndObject(); } }}

(2)序列化程序修改器

 

  

import com.fasterxml.jackson.databind.BeanDescription;import com.fasterxml.jackson.databind.SerializationConfig;import com.fasterxml.jackson.databind.ser.BeanPropertyWriter;import com.fasterxml.jackson.databind.ser.BeanSerializerModifier;import java.util.Collection;import java.util.List; /** * <pre> * 此modifier主要做的事情为: * 1.当序列化类型为数组集合时,当值为null时,序列化成[] * 2.String类型值序列化为"" * * </pre> */public class MyBeanSerializerModifier extends BeanSerializerModifier { @Override public List<BeanPropertyWriter> changeProperties(SerializationConfig config, BeanDescription beanDesc, List<BeanPropertyWriter> beanProperties) { // 循环所有的beanPropertyWriter for (int i = 0; i < beanProperties.size(); i++) { BeanPropertyWriter writer = beanProperties.get(i); // 判断字段的类型,如果是数组或集合则注册nullSerializer if (isArrayType(writer)) { // 给writer注册一个自己的nullSerializer writer.assignNullSerializer(new CustomizeNullJsonSerializer.NullArrayJsonSerializer()); } if (isStringType(writer)) { writer.assignNullSerializer(new CustomizeNullJsonSerializer.NullStringJsonSerializer()); } } return beanProperties; } /** * 是否是数组 */ private boolean isArrayType(BeanPropertyWriter writer) { Class<?> clazz = writer.getType().getRawClass(); return clazz.isArray() Collection.class.isAssignableFrom(clazz); } /** * 是否是String */ private boolean isStringType(BeanPropertyWriter writer) { Class<?> clazz = writer.getType().getRawClass(); return CharSequence.class.isAssignableFrom(clazz) Character.class.isAssignableFrom(clazz); } /** * 是否是数值类型 */ private boolean isNumberType(BeanPropertyWriter writer) { Class<?> clazz = writer.getType().getRawClass(); return Number.class.isAssignableFrom(clazz); } /** * 是否是boolean */ private boolean isBooleanType(BeanPropertyWriter writer) { Class<?> clazz = writer.getType().getRawClass(); return clazz.equals(Boolean.class); }}

(3)配置Jackson实体

 

  

import com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.SerializerProvider;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; /** * 配置Jackson实体 */@Configurationpublic class JacksonConfig { @Bean @Primary @ConditionalOnMissingBean(ObjectMapper.class) public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); /** 为objectMapper注册一个带有SerializerModifier的Factory */ objectMapper.setSerializerFactory(objectMapper.getSerializerFactory() .withSerializerModifier(new MyBeanSerializerModifier())); SerializerProvider serializerProvider = objectMapper.getSerializerProvider(); serializerProvider.setNullValueSerializer(new CustomizeNullJsonSerializer .NullObjectJsonSerializer()); return objectMapper; }}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持盛行IT。

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • js把字符串转为json,json字符串转换成json对象
  • js把字符串转为json,json字符串转换成json对象,js 将json字符串转换为json对象的方法解析
  • json语法格式,json格式定义
  • json语法格式,json格式定义,Json格式详解
  • json格式数据类型,什么是JSON数据-其常见格式是什么-
  • json格式数据类型,什么是JSON数据-其常见格式是什么-,JSON 数据格式详解
  • json格式怎么写,json文件内容格式
  • json格式怎么写,json文件内容格式,json文件书写格式详解
  • json数组对象转化为json字符串,js把数组转化为json
  • json字符串转换成对象有哪几种方法,字符串转化为json的方法
  • json字符串转换成对象有哪几种方法,字符串转化为json的方法,JSON对象转化为字符串详解
  • json基础介绍与详细用法教程,json基础知识
  • json基础介绍与详细用法教程,json基础知识,JSON基础介绍与详细用法
  • json去掉反斜杠,json字符串中有反斜杠
  • json去掉反斜杠,json字符串中有反斜杠,详解json串反转义(消除反斜杠)
  • 留言与评论(共有 条评论)
       
    验证码: