使用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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • STUN详解

    STUN详解STUN是一个简单的客户端-服务器协议。客户端发送一个请求到一台服务器,而服务器返回一个响应。有两种类型的请求:绑定请求(通过UDP发送)和共享密钥请求(发送TLS(通过TCP))。共享秘密请求服务器返回一个临时的用户名和密码。此用户名和密码用于在随后的绑定请求和绑定响应,身份验证和消息完整性的目的。STUN客户和STUN服务器之间可能有一个或多个NAT。

  • linux tar命令详解_linux gzip命令

    linux tar命令详解_linux gzip命令搬运[置顶]:https://www.cnblogs.com/sui776265233/p/10185402.html通过SSH访问服务器,难免会要用到压缩,解压缩,打包,解包等,这时候tar命令就

  • 查看Linux内核版本的命令_ubuntu 查看内核

    查看Linux内核版本的命令_ubuntu 查看内核有朋友在使用Linux的过程中要查看Linux的内核版本号,这要怎么看呢?也有朋友文要怎么查看linux系统版本信息呢?下面和小编一起了解一下吧。一、查看linux内核版本号1:登录linux,在终端输入cat/proc/version2:登录linux,在终端输入uname-a即列出linux的内核版本号。二、查看linux系统版本信息1:登录到linux服务器执行lsb_rele…

  • 游戏建模自学真的能学出来吗?

    游戏建模自学真的能学出来吗?游戏建模自学肯定是能学出来的,但这有几个先决条件:1.高度的自律性2.时间,你得有一定的空闲时间用于学习和练习,全日制的同学们每天从早上8/9点钟一直到6点过7点都在学习、做作品,可能回家之后还在练习,一天花在建模上的时间比8个小时只多不少,所以你肯定不能指望着每天一两个小时的练习时间就能突飞猛进成为大佬(除非你有基础且天赋异禀,这个另当别论)3.有人指导帮你找出你的问题并给出改正方案最后,不可否认确实有部分同学可以通过自学入行,也确实会有很多人出于各种各样的原因觉得培训班不靠谱想自学,

  • python里for循环用法_python遍历循环

    python里for循环用法_python遍历循环python中使用for循环的方法发布时间:2020-12-0809:35:27来源:亿速云阅读:95作者:小新小编给大家分享一下python中使用for循环的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!python循环方式有两个,一个是while循环,另一个就是for循环,while循环和if条件分支语句类似,即在条件(表达式)为真的情况下,会执行相应的代码块。…

  • Latex学习 day1「建议收藏」

    Latex学习 day1「建议收藏」这周学习超卖力,到今天周五累到了,不想搞遗传算法也不想搞神经网络了,今天来玩玩latex,系统地看看刘海洋老师的书书,之前也鼓捣过,不系统,查漏补缺吧。玩一玩大概就可以通过愧疚学习法找到继续搞正经活儿的动力了Ctrl+鼠标左键正反向查找按tab自动补全\docTab补全\documentclass{}\beqtab补全公式环境\begin{equation}…

发表回复

您的电子邮箱地址不会被公开。

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