服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 解决ObjectMapper序列换Map时候的坑

解决ObjectMapper序列换Map时候的坑

2021-11-24 12:01xjz1842 Java教程

这篇文章主要介绍了解决ObjectMapper序列换Map时候的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

ObjectMapper序列换Map时候的坑

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

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

打印日志的代码如下

解决ObjectMapper序列换Map时候的坑

打印的结果如下:

解决ObjectMapper序列换Map时候的坑

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

是ObjectMapper的序列化的问题

解决ObjectMapper序列换Map时候的坑

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

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

解决ObjectMapper序列换Map时候的坑

很简单只要转化的时候讲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

延伸 · 阅读

精彩推荐