解决ObjectMapper序列换Map时候的坑
ObjectMapper序列换Map时候的坑
今天,工作中,再一个分布式应用中,一个服务要调用另外一个服务,传输的数据时,返回的类型的Map<Integer,Integer>类型
的数据,但是我打印日志发现,数据是有数据的,但是通过key始终get不出来数据,后来发现传输回来的数据的key变成了String, 是不是很诡异。
打印日志的代码如下

打印的结果如下:

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

打印处理的是 null,22,说明key变成了String。
怎么解决这个问题,看下代码:

很简单只要转化的时候讲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<Object>() {
@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依赖
<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency>
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
赞 (0)
