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>
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/xjz1842/p/8317902.html