spring(一) spring-json全局序列化

场景介绍

后台传送数据给前端,通常使用json ,多的不说,看个例子:html

若是使用mongodb数据库,很是容易出现一种情况, 在传送ObjectId (默认数据能够的主键)时会发生以下状况:前端

data :{
    objectId :{
        timestamp:123123123,
        machineIdentifier: 12,
        processIdentifier: 12,
        counter:5 6,
    },
    name:“张三”
  }

问题出现了,ObjectId 前端只是要咱们说传递一个字符串(ObjectId的),而咱们却传递了一个对象,前端确定会(你懂的!!!)java

解决方式

方式一:注解加入

  1. 写一个应对ObjectId的json序列化类,将序列化的函数重写
public class ObjectIdSerializer extends JsonSerializer<ObjectId> {
    
    @Override
    public void serialize(ObjectId value, JsonGenerator jsonGen,
            SerializerProvider provider) throws IOException,
            JsonProcessingException {
        jsonGen.writeString(value.toString());
    }
}
  1. 在须要导出的java 类中的 ObjectId的属性上加注解,示例以下:
Class User{
    @JsonSerialize(using = ObjectIdSerializer.class)
    private ObjectId id;
    private String name;
}

优点:能够解决问题 <br> 缺点:整个项目但凡要 传递给前端的,都须要加入整个注解web

方式二:全局配置

全局配置是要带 方式一 第一个步骤的基础之上的,具体操做以下:spring

  1. 建立自定义ObjectMapper类,以下所示:
@SuppressWarnings("serial")
public class ObjectIdMapper extends ObjectMapper {
    
    public ObjectIdMapper() {
        SimpleModule module = new SimpleModule("ObjectIdmodule");
        module.addSerializer(ObjectId.class, new ObjectIdSerializer());
        this.registerModule(module);
    }

}
  1. ssm 项目,spring配置文件中加入如下配置(springboot项目直接配置Bean 就行了):
<bean id="mappingJackson2HttpMessageConverter"
            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
    <property name="supportedMediaTypes">
        <list>
            <value>text/html;charset=UTF-8</value>
        </list>
    </property>
    <!-- <property name="objectMapper">
         <bean class="com.ftf.clw.dsc.web.convert.ObjectIdMapper"></bean>
     </property> -->
</bean>

3)springboot 项目,直接加入一个配置bean 就行了,配置以下mongodb

@Configuration
public class JsonMessageConverter {

    @Bean
    public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder){
        ObjectMapper objectMapper = builder.createXmlMapper(false).build();

        //将json属性的空值null转化为空字符串""
        objectMapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
            @Override
            public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
                gen.writeString("");
            }
        });

        SimpleModule module = new SimpleModule();
        module.addSerializer(ObjectId.class, new ObjectIdSerializer());
        objectMapper.registerModule(module);
        return objectMapper;
    }
}

测试结果

data :{
    objectId :"jjaiaiajiaiaiajaldkdkdkdkdkdkdd",
    name:“张三”
  }

底层剖析

使用的是java序列化的开源jar, Jackson <br>数据库

jackson参见 <br> springboot 修改序列化工具 Jackson 改成 FastJson <br>json

相关文章
相关标签/搜索