解决ObjectMapper序列换Map时候的坑

 更新时间:2021年08月19日 08:48:07   作者:xjz1842  
这篇文章主要介绍了解决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>

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

相关文章

  • Java文件读写IO/NIO及性能比较详细代码及总结

    Java文件读写IO/NIO及性能比较详细代码及总结

    这篇文章主要介绍了Java文件读写IO/NIO及性能比较详细代码及总结,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • java Aop实现自动填充字段值示例

    java Aop实现自动填充字段值示例

    这篇文章主要为大家介绍了Aop实现自动填充字段值示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 23种设计模式(21)java享元模式

    23种设计模式(21)java享元模式

    这篇文章主要为大家详细介绍了23种设计模式之java享元模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 通过Java修改游戏存档的实现思路

    通过Java修改游戏存档的实现思路

    这篇文章主要介绍了通过Java修改游戏存档的实现思路,实现方法也很简单,因为植物大战僵尸游戏的数据文件存储在本地的存储位置是已知的,因此我们可以将实现过程拆分为三个步骤,需要的朋友可以参考下
    2021-10-10
  • java之map集合存放null值的问题

    java之map集合存放null值的问题

    这篇文章主要介绍了java之map集合存放null值的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Java 栈和队列的交互实现

    Java 栈和队列的交互实现

    栈和队列都是常用的数据结构,本文就来介绍一下Java 栈和队列的交互实现,主要包括队列模拟实现栈及栈模拟实现队列,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • SpringBoot与SpringMVC中参数传递的原理解析

    SpringBoot与SpringMVC中参数传递的原理解析

    这篇文章主要介绍了SpringBoot与SpringMVC中参数传递的原理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 深入理解Java中的final关键字_动力节点Java学院整理

    深入理解Java中的final关键字_动力节点Java学院整理

    Java中的final关键字非常重要,它可以应用于类、方法以及变量。这篇文章中我将带你看看什么是final关键字以及使用final的好处,具体内容详情通过本文学习吧
    2017-04-04
  • maven学习-初窥门径

    maven学习-初窥门径

    这篇文章主要介绍了maven的简单知识,介绍了maven的定义及核心功能,具有一定参考价值,大家可以了解下。
    2017-10-10
  • java设计模式--三种工厂模式详解

    java设计模式--三种工厂模式详解

    这篇文章主要为大家详细介绍了Java设计模式之工厂模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能给你带来帮助
    2021-07-07

最新评论