zoukankan      html  css  js  c++  java
  • fastjson,对象转json字符串的过程中对value为null的值的一些处理

    前言

    fastjson是一个非常好用的java库,用于操作对象json序列化等等。

    问题

    最近在写代码的时候遇到问题,通过JSON.toJSONString方法将一个实体对象转为json字符串,转出来发现原本
    对象中value为null的字段被过滤掉了。。。

    实体对象

    package so.sao.code;
    
    import lombok.Data;
    
    @Data
    public class Person {
    
        String name;
    
        String gender;
    
        String nickname;
    
        String phone;
    
    }
    

    测试代码

        public static void main(String[] args) {
            Person person = new Person();
            person.setName("wyz");
            String json = JSON.toJSONString(person);
            System.out.println(json);
        }
    

    输出结果

    发现只有设置了值的字段name才有输出,而其余为空的字段则都被过滤掉了

    解决

    怎样让值为null的key不被过滤掉

    • 设置SerializerFeature

    设置SerializerFeature里面有很多特性可以使用

    要让空值也能够输出的特性值是SerializerFeature.WriteMapNullValue

    改造代码:

        public static void main(String[] args) {
            Person person = new Person();
            person.setName("wyz");
    //        String json = JSON.toJSONString(person);
    //        System.out.println(json);
    
            // 设置SerializerFeature
            System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));
        }
    

    输出结果:

    值为null属性直接放到json字符串里面不太好看,能不能把null值转成其他的值,比如空字符串

    这个时候就需要用到过滤器了,仔细看看JSON.toJSONString的其他几个方法

    toJSONString方法中可以放一个或多个过滤器,常用的过滤器有以下几种:

    要实现把null值转为空字符串的效果可以使用ValueFilter

    代码实现:

        public static void main(String[] args) {
            Person person = new Person();
            person.setName("wyz");
    //        String json = JSON.toJSONString(person);
    //        System.out.println(json);
    
            // 设置SerializerFeature
    //        System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));
    
            // 设置NameFilter
            System.out.println(JSON.toJSONString(person, (ValueFilter) (object, name, value) -> {
                if(value == null){
                    return "";
                }
    
                return value;
            }));
        }
    

    输出结果:

    一个特殊的需求,有的值为null需要过滤,有的又不需要过滤。。。(这就是我遇到的)

    使用PropertyFilter

    代码实现:

        public static void main(String[] args) {
            Person person = new Person();
            person.setName("wyz");
    //        String json = JSON.toJSONString(person);
    //        System.out.println(json);
    
            // 设置SerializerFeature
    //        System.out.println(JSON.toJSONString(person, SerializerFeature.WriteMapNullValue));
    
            // 设置NameFilter
    //        System.out.println(JSON.toJSONString(person, (ValueFilter) (object, name, value) -> {
    //            if(value == null){
    //                return "";
    //            }
    //
    //            return value;
    //        }));
    
            // 设置PropertyFilter
            System.out.println(JSON.toJSONString(person, new PropertyFilter() {
                @Override
                public boolean apply(Object object, String name, Object value) {
                    return name.equals("gender") || value != null;
                }
            }, SerializerFeature.WriteMapNullValue));
        }
    

    输出结果:

  • 相关阅读:
    python新建以时间命名的目录
    selenium跳过https的问题
    selenium修改控件属性
    selenium遍历控件集合
    知识库系统confluence5.8.10 安装与破解
    python3 遍历文件
    mysql更新密码为空
    CentOS7下安装配置vncserver
    Centos7搭建php+mysql环境(整理篇)
    centos7上安装与配置Tomcat7(整理篇)
  • 原文地址:https://www.cnblogs.com/alinainai/p/13410149.html
Copyright © 2011-2022 走看看