使用Fastjson生成Json字符串少字段属性(数据丢失)「建议收藏」

在开发中经常要使用到fastJson来转换对象为json 串,但是最近发现在一个对象转换的时候,总是丢失了一个字段的值,(数据丢失).就很纳闷。到网上找了很多方法总是不行,最后总算是在一篇博文中看到问题的关键!现在整理如下,希望可以帮助到更多的人。package per.eblink.pojo; public class Node { private String id

大家好,又见面了,我是全栈君。

在开发中经常要使用到fastJson来转换对象为json 串,但是最近发现在一个对象转换的时候,总是丢失了一个字段的值,(数据丢失).就很纳闷。到网上找了很多方法总是不行,最后总算是在一篇博文中看到问题的关键!现在整理如下,希望可以帮助到更多的人。

package per.eblink.pojo;
 
public class Node {
     
    private String id;
    private String pId;
    private String name;
    private boolean open;
     
    private Node() {
        super();
    }
 
    public Node(String id, String pId, String name, boolean open) {
        super();
        this.id = id;
        this.pId = pId;
        this.name = name;
        this.open = open;
    }
     
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getpId() {
        return pId;
    }
    public void setpId(String pId) {
        this.pId = pId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public boolean isOpen() {
        return open;
    }
    public void setOpen(boolean open) {
        this.open = open;
    }     
}

转换类:

<span style="font-size:14px;">package per.eblink.pojo;
 
public class Node {
     
    private String id;
    private String pId;
    private String name;
    private boolean open;
     
    private Node() {
        super();
    }
 
    public Node(String id, String pId, String name, boolean open) {
        super();
        this.id = id;
        this.pId = pId;
        this.name = name;
        this.open = open;
    }
     
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getpId() {
        return pId;
    }
    public void setpId(String pId) {
        this.pId = pId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public boolean isOpen() {
        return open;
    }
    public void setOpen(boolean open) {
        this.open = open;
    }     
}</span>


最后是控制台打印生成的结果如下:
FastJson生成字符串是:{“id”:”2″,”name”:”节点1″,”open”:true}
Gson生成字符串是:{“id”:”2″,”pId”:”1″,”name”:”节点1″,”open”:true}



用FastJson就是少了个属性pId没有被转化出来,用Gson和其他的却可以,而我的Node对象只是个普通的JAVA类而已,麻烦你看一下,谢谢!


答案:1)你的get,set方法估计多半是自动生成的,Fastjson在生成的时候去判断pId有没有对应的get方法是区分了大小写的,所以找不到对应的get方法(getPId())。

2)如果页面上也需要使用node对象,就必须使用自动生成的get、set方法。与1)相互冲突,最根本的解决办法是,不适用第一个单词只有一个小写字母的属性名,换一个属性名字paId。


问题2:fastjson生成json时Null属性不显示

生成JSON代码片段

[java] 
预览
复制

  1. Map < String , Object > jsonMap = new HashMap< String , Object>();  
  2. jsonMap.put(“a”,1);  
  3. jsonMap.put(“b”,“”);  
  4. jsonMap.put(“c”,null);  
  5. jsonMap.put(“d”,“wuzhuti.cn”);  
  6.   
  7. String str = JSONObject.toJSONString(jsonMap);  
  8. System.out.println(str);  
  9. //输出结果:{“a”:1,”b”:””,d:”wuzhuti.cn”}  

从输出结果可以看出,null对应的key已经被过滤掉;这明显不是我们想要的结果,这时我们就需要用到fastjson的SerializerFeature序列化属性

也就是这个方法:JSONObject.toJSONString(Object object, SerializerFeature… features)

Fastjson的SerializerFeature序列化属性

–来自oschina bfleeee博客

QuoteFieldNames———-输出key时是否使用双引号,默认为true 
WriteMapNullValue——–是否输出值为null的字段,默认为false 
WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null 
WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null 
WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null 
WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null

代码

[java] 
预览
复制

  1. Map < String , Object > jsonMap = new HashMap< String , Object>();  
  2. jsonMap.put(“a”,1);  
  3. jsonMap.put(“b”,“”);  
  4. jsonMap.put(“c”,null);  
  5. jsonMap.put(“d”,“wuzhuti.cn”);  
  6.   
  7. String str = JSONObject.toJSONString(jsonMap,SerializerFeature.WriteMapNullValue);  
  8. System.out.println(str);  
  9. //输出结果:{“a”:1,”b”:””,”c”:null,”d”:”wuzhuti.cn”}  

参考文章:

1)fastjson生成json时Null属性不显示:http://www.oschina.net/question/818749_131396 

2)使用Fastjson生成Json字符串少字段属性:  http://www.oschina.net/question/818749_131396

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121248.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Spring Boot 中使用 @Transactional 注解配置事务管理

    Spring Boot 中使用 @Transactional 注解配置事务管理事务管理是应用系统开发中必不可少的一部分。Spring为事务管理提供了丰富的功能支持。Spring事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染,因此在实际使用中声明式事务用的比较多。

    2022年6月6日
  • k8s监控工具(k8s工具)

    工具集合:后渗透:Kubesploit:https://github.com/cyberark/kubesploit安全评估:RedKube:https://github.com/lightspin-tech/red-kube容器攻击工具:ccat:https://github.com/RhinoSecurityLabs/ccat安全测试:Kubestriker:https://github.com/vchinnipilli/kubestriker地址GitHub-aqu

    2022年4月17日
  • RabbitMQ 原理图和名词理解(二)[通俗易懂]

    RabbitMQ 原理图和名词理解(二)[通俗易懂]一、RabbitMQ简介RabbitMQ是基于AMQP实现的一个开源消息组件,主要用于在分布式系统中存储转发消息,由因高性能、高可用以及高扩展而出名的Erlang写成。其中,AMQP(AdvancedMessageQueuingProtocol,即高级消息队列协议),是一个异步消息传递所使用的应用层协议规范,为面向消息的中间件设计。RabbiMQ是EDA事件驱动架构的核心,也是CQR…

    2022年6月22日
  • r语言的for循环_两效十MVR强制循环

    r语言的for循环_两效十MVR强制循环R语言for循环for循环本教程将针对初学者,探讨如何在R语言中编写基本的for循环和嵌套式for循环。简单for循环R中for循环的基本语法是:for(iR简单for循环示例:#forloopinR上述例子中直接将结果进行print,在实际应用中基本不会这么做。一般会将输出结果以向量或其他形式储存。如下:x5)for(iin1:5){x[i]2}x#outp…

    2022年10月27日
  • Redis 设置密码登录

    Redis 设置密码登录

    2021年10月27日
  • 一个依赖搞定 Spring Boot 反爬虫,防止接口盗刷!

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 责编:乐乐 链接:oschina.net/news/112586/kk-anti-reptile-released …

    2021年6月24日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号