解决ObjectMapper序列换Map时候的坑

ObjectMapper序列换Map时候的坑

今天,工作中,再一个分布式应用中,一个服务要调用另外一个服务,传输的数据时,返回的类型的Map类型

的数据,但是我打印日志发现,数据是有数据的,但是通过key始终get不出来数据,后来发现传输回来的数据的key变成了String, 是不是很诡异。

打印日志的代码如下

打印的结果如下:

解决ObjectMapper序列换Map时候的坑_第1张图片

作为技术人,看到这样的情况,就像刨根问底,然后的看到了项目中使用的源码,然后本地模拟了下,发现原来

是ObjectMapper的序列化的问题

解决ObjectMapper序列换Map时候的坑_第2张图片

打印处理的是 null,22,说明key变成了String。

怎么解决这个问题,看下代码:

解决ObjectMapper序列换Map时候的坑_第3张图片

很简单只要转化的时候讲Object.class转化成map.getClass();,就可以了,结果输出的是 22,null

jackson ObjectMapper 序列化成json

属性值为null时转换为""空字符串

import java.io.IOException; 
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializerProvider;
import org.junit.Test;
 
public class JsonTest { 
    protected static String getJson(Object obj) {
        ObjectMapper mapper = new ObjectMapper();
        // null替换为""
        mapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer() {
            @Override
            public void serialize(Object arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException, JsonProcessingException {
                arg1.writeString("");
            }
        });
        String str = null;
        try {
            str = mapper.writeValueAsString(obj);
        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
    }
 
    @Test
    public void test() {
        System.out.println(getJson(new TestObject()));//TestObject必须是POJO对象
    } 
}
 
class TestObject {
    String name = "张三";
    String sex = null; 
    public String getName() {
        return name;
    } 
    public void setName(String name) {
        this.name = name;
    } 
    public String getSex() {
        return sex;
    } 
    public void setSex(String sex) {
        this.sex = sex;
    } 
} 
  
 

运行结果:{"name":"张三","sex":""}

maven依赖

  
   org.codehaus.jackson
   jackson-mapper-asl
   1.9.13
  

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

你可能感兴趣的:(解决ObjectMapper序列换Map时候的坑)