1.map中有null key时的序列化

 当有null key时,jackson序列化会报 Null key for a Map not allowed in JSON (use a converting NullKeySerializer?) 

处理此异常有两种方式

  • 1.需要自定义一个序列化null key的方法
  • 2. map中直接remove null key

这里只讨论第一种:

处理方法为 mapper.getSerializerProvider().setNullKeySerializer(new NullKeySerializer()); 将null key处理为空字符

  1. @Test
  2. public void testSerializMapNullKey() throws JsonProcessingException {
  3. //ignore map null value
  4. Map<String, Object> map = new HashMap<>();
  5. map.put(null, "test");
  6. ObjectMapper mapper = new ObjectMapper();
  7. mapper.getSerializerProvider().setNullKeySerializer(new NullKeySerializer());
  8. System.out.println(mapper.writeValueAsString(map));
  9.  
  10. }
  11.  
  12. static class NullKeySerializer extends StdSerializer<Object> {
  13. public NullKeySerializer() {
  14. this(null);
  15. }
  16.  
  17. public NullKeySerializer(Class<Object> t) {
  18. super(t);
  19. }
  20.  
  21. @Override
  22. public void serialize(Object nullKey, JsonGenerator jsonGenerator, SerializerProvider unused)
  23. throws IOException, JsonProcessingException {
  24. jsonGenerator.writeFieldName("");
  25. }
  26. }
  1. {"":"test"}
  2.  
  3. Process finished with exit code 0

2. 处理null value的情况

  1. @Test
  2. public void testIgnoreMapNullValue() throws JsonProcessingException {
  3. //ignore null key
  4. Map<String, Object> map = new HashMap<>();
  5. map.put("key", "test");
  6. map.put("key1", null);
  7. ObjectMapper mapper = new ObjectMapper();
  8. mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
  9. System.out.println(mapper.writeValueAsString(map));
  10.  
  11. }

输出为:{"key":"test"} 并没有 key1:null

  1. {"key":"test"}
  2.  
  3. Process finished with exit code 0

3. 处理实体中filed中值为null的情况

使用注解:@JsonInclude(JsonInclude.Include.NON_NULL)

注意:@JsonInclude(JsonInclude.Include.NON_NULL)即可以在实体上用,也可以在filed中使用,比如在name上用这个注解

  1. @Test
  2. public void testIgnoreNullFiled() throws JsonProcessingException {
  3. //test ignore null filed
  4. User user = new User();
  5. user.setName(null);
  6. user.setHouse("asdf");
  7. ObjectMapper mapper = new ObjectMapper();
  8. System.out.println(mapper.writeValueAsString(user));
  9.  
  10. }
  11.  
  12. /**
  13. * ignore null filed
  14. */
  15. @JsonInclude(JsonInclude.Include.NON_NULL)
  16. class User {
  17. private String name;
  18. private String house;
  19.  
  20. public String getName() {
  21. return name;
  22. }
  23.  
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27.  
  28. public String getHouse() {
  29. return house;
  30. }
  31.  
  32. public void setHouse(String house) {
  33. this.house = house;
  34. }
  35. }

输出为:

  1. {"house":"asdf"}
  2.  
  3. Process finished with exit code 0

如果设置全局怎么设置呢,使用: mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

  1. @Test
  2. public void testIgnoreNullFiledGlobally() throws JsonProcessingException {
  3. //test ignore null filed
  4. User user = new User();
  5. user.setName(null);
  6. user.setHouse("asdf");
  7. ObjectMapper mapper = new ObjectMapper();
  8.  
  9. //Ignore Null Fields Globally
  10. mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
  11. System.out.println(mapper.writeValueAsString(user));
  12.  
  13. }

参考:1.https://www.baeldung.com/jackson-map-null-values-or-null-key

         2.https://github.com/eugenp/tutorials/tree/master/jackson-simple

Jackson中处理map中的null key 或者null value 及实体字段中的null value的更多相关文章

  1. 在论坛中出现的比较难的sql问题:16(取一个字段中的数字)

    原文:在论坛中出现的比较难的sql问题:16(取一个字段中的数字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 问题:取一个字段中的数字http://bbs.csdn ...

  2. foreach属性-动态-mybatis中使用map类型参数,其中key为列名,value为列值

    http://zhangxiong0301.iteye.com/blog/2242723 最近有个需求,就是使用mybatis时,向mysql中插入数据,其参数为map类型,map里面的key为列名, ...

  3. 向数据库中插入一个DateTime类型的数据到一个Date类型的字段中,需要转换类型。TO_DATE('{0}','YYYY-MM-DD'))

    需要指出的是,C#中有datetime类型,但是这个类型是包括小时,分钟,秒的.这个格式与数据库中的Date类型不符,如果将now设为datetime类型插入数据会失败. 需要通过TO_DATE('字 ...

  4. mysql 允许在唯一索引的字段中出现多个null值

    线上问题:org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [update fl_table ...

  5. 程序处理数据库中值字段值为null的查询显示

    1.如果你做了一个简单的注册界面,需要用户进行注册,但有些项是不必要填的,当用户完成注册时,数据库表中的相应字段的值会写入null,但如何将查询的字段的值null显示出来? 2.首先我们学习一下如何向 ...

  6. mysql 中查询一个字段是否为null的sql

    查询mysql数据库表中字段为null的记录: select * 表名 where 字段名 is null 查询mysql数据库表中字段不为null的记录: select * 表名 where 字段名 ...

  7. 当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出?

    当实体类中entity/DTO/VO等类中,有枚举值,应该怎么输出? 问题: orderStatus 和 payStatus都是枚举类,并且枚举的个数达地10来个,我们不可能在模板页面(jsp/ftl ...

  8. Java中Map根据键值(key)或者值(value)进行排序实现

    我们都知道,java中的Map结构是key->value键值对存储的,而且根据Map的特性,同一个Map中 不存在两个Key相同的元素,而value不存在这个限制.换句话说,在同一个Map中Ke ...

  9. jstl中取map,其中map的key是一个对象,value是一个list

    <c:forEach items="${map }" var="item"> //取得key中的属性 ${item.key.name } <c ...

随机推荐

  1. vue项目报错如下:(Emitted value instead of an instance of Error)

    (Emitted value instead of an instance of Error) the "scope" attribute for scoped slots hav ...

  2. Java初学者作业——使用记事本编写Java程序

    返回本章节 返回作业目录 需求说明: 使用记事本编写 Java 程序,输出"大家好!我的梦想是做一名 Java 高级工程师!". 为 Java 程序添加单行和多行注释以及文档注释. ...

  3. Solr集群安装Version5.5.2(cloud模式)

    Solr安装cloud模式,基于Solr的安装版本为5.5.2. 安装规划 Solr IP/机器名 安装软件 运行进程 zdh-7 solr jar zdh-9 solr jar zookeeper ...

  4. 初识python: for循环之“两数之和”

    需求:给定一个数字列表和一个目标值,找出列表中和为目标值的两个数: #!/user/bin env python # author:Simple-Sir # time:20180913 # 给定一个整 ...

  5. [Flask] Flask问题集(后端模板渲染项目)

    1.redirect和render_template的区别? redirect:重定向,会改变url render_template:模板渲染,用模板来渲染当前页,不会改变url 2.关于 'g' 对 ...

  6. HTTP 408 问题 - Koa body parser

    环境描述: 1.nodejs 作为 api 服务器,转发请求给 nginx 2.用 curl 测试,返回 408 找了很久没有找到原因,发现了一篇文章: https://lujunda.cn/2016 ...

  7. Spark应用的结构的学习

    关注公众号:分享电脑学习回复"百度云盘" 可以免费获取所有学习文档的代码(不定期更新) 承接上一篇文档<Standalone集群搭建和Spark应用监控> 需要了解的概 ...

  8. HDOJ1573X问题

    https://acm.hdu.edu.cn/showproblem.php?pid=1573 n组线性同余方程求解,最后求出多少解.而最终的解的周期为最小公倍数,范围内的,需要这样算.如果最小超过, ...

  9. 1.linux中的常用命令

    本文积累工作中常用到的Linux命令 1. rz -be 文件上传到Linux服务器 此命令执行时,会弹出文件选择对话框,选择好需要上传的文件之后,点确定,就可以开始上传的过程了.上传的速度取决于当时 ...

  10. 关于CKCsec安全研究院

    关于CKCsec安全研究院 CKCsec安全研究院所有文档开源于语雀,会源源不断更新. 部分内容 微信公众号 知识星球 使用需知 由于传播.利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均 ...