jsonfield注解不生效(write javabean error fastjson)

@jsonfield看源码它可以作用于字段和方法上。引用网上说的,一、作用field@jsonfield作用在field时,其name不仅定义了输入key的名称,同时也定义了输出的名称。但是我在使用中,发现并不如上所说。例如@jsonfield(name=”project_id”)privatelongprojectid发现bean转json的时候并是”project_id”:xxx的形式,…

大家好,又见面了,我是你们的朋友全栈君。

@jsonfield

看源码它可以作用于字段和方法上。

引用网上说的,

一、作用field

@jsonfield作用在field时,其name不仅定义了输入key的名称,同时也定义了输出的名称。

但是我在使用中,发现并不如上所说。

例如

@jsonfield(name=”project_id”)

private long projectid

发现bean 转json的时候并是”project_id”:xxx的形式,json转bean的时候也不会把”project_id”:xx的内容设置到projectid的里面。

fastjson的版本是1.1.15

二、作用在setter和getter方法上 这种方式倒是在使用的过程当中符合期望。

/**bean 转json 时会把bean中的projectid转换为project_id */

@jsonfield(name=”project_id”)

public long getprojectid() {

return projectid;

}

/**json 转bean 时会把json中的project_id值赋值给projectid*/

@jsonfield(name=”project_id”)

public void setprojectid(long projectid) {

projectid = projectid;

}

三、@jsonfield其它用法,查看@jsonfield注解的源码,除了name可用之外,还有format,serialize,deserialize,serialzefeatures,parsefeatures可用,

•format,貌似用在date类型的字段来格式化时间格式比较有用。

•serialize和deserialize是布尔类型的,用法为

@jsonfield(serialize=false)

private long projectid

就是在序列化的时候就不包含这个字段了。deserialize与之相反。但是有一点需要注意,我看其它地方说,当字段为final的时候注解放在字段上是不起作用的,这时候应该放在get

或set方法上。

•serialzefeatures,我用到这个属性,fastjson默认的序列化规则是当你的字段的值为null的时候,它是不会给你序列化这个字段的,例如我有一个这样的需求,

{“fieldname”:”project_id”,”operator”:”is not”,”value”:null}

一个对象序列化成这样,我的代码如下

criteriavo criteriavo = new criteriavo();

criteriavo.setfieldname(“project_id”);

criteriavo.setoperator(“is not”);

criteriavo.setvalue(null);

默认的它只会序列化为如下结果

{“fieldname”:”project_id”,”operator”:”is not”}

当然fastjson还是允许你控制一下序列化的规则的。

这就用到了serializerfeature,这个一个枚举,里面有好几个值 ,具体的含义大家有兴趣的可以了解一下,

我只是用到了其中一个,

@jsonfield(serialzefeatures=serializerfeature.writemapnullvalue)

private string value;

这样当value的值为null的时候,依然会把它的值序列化出来。也就是下面的样子,这就是我想要的结果

{“fieldname”:”project_id”,”operator”:”is not”,”value”:null}

又遇到了另一个问题,当字段类型为int类型时,如

private int start;

private int limit;

我如果不set值的时候,会序列化为下面这样

“limit”:0,”start”:0

默认为都是0了,而我的目标是如果不设置值的时候,它们不会出现。

我是简单地通过把他们的类型改为integer了。应该有其它通过自定义序列化行为的方式来解决,暂不研究。

以上这篇关于fastjson的@jsonfield注解的一些问题(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持萬仟网。

希望与广大网友互动??

点此进行留言吧!

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

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

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


相关推荐

  • vue详解_vuex getters

    vue详解_vuex gettersVuex是做什么的?官方解释:Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。Vuex

    2022年7月31日
    10
  • AssetBundle 详解

    AssetBundle 详解文章目录AssetBundle的定义和作用什么是AssetBundle用处AssetBundle使用流程图指定资源的AssetBundle属性构建AssetBundle包核心代码详解上传AB包加载AB包和包里面的资源加载本地的AB包加载服务器上的AB包AssetBundle分组策略按照逻辑实体分组按照资源类型分组按照使用分组构建AB后产生的文件AssetBund…

    2022年6月29日
    29
  • python错误之ImportError: No module named ‘cPickle'[通俗易懂]

    python错误之ImportError: No module named ‘cPickle'[通俗易懂]在python3.x下使用如下代码:importcPickleaspk会报如下错误:ImportError:Nomodulenamed’cPickle’原因:python2有cPickle,但是在python3下,是没有cPickle的;解决办法:将cPickle改为pickle即可,代码如下:importpickleaspkpython编程需要格外注意

    2022年6月17日
    85
  • java除法保留两位小数_JAVA除法保留小数点后两位的两种方法

    java除法保留两位小数_JAVA除法保留小数点后两位的两种方法1.利用Math.round()的方法:两个int型的数相除,结果保留小数点后两位:inta=1188;intb=93;doublec;c=(double)(Math.round(a*100/b)/100.0);//这样为保持2位打印结果:c=0.12c=newDouble(Math.round(a*1000/b)/1000.0);//这样为保持3位打印结果:c=0.0122.另一种办法i…

    2022年5月10日
    41
  • webstorm2021 激活码 online【2021免费激活】

    (webstorm2021 激活码 online)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1…

    2022年3月27日
    79
  • FTP客户端FlashFXP激活成功教程教程[通俗易懂]

    FTP客户端FlashFXP激活成功教程教程[通俗易懂]flashfxp5.4下载地址:https://www.flashfxp.com/download激活成功教程工具下载地址:链接:https://pan.baidu.com/s/17Dq_OnH-ua9fbOuvMIdRXQ密码:laat下载之后然后正常安装就行了,安装完毕之后,先别打开软件,激活成功教程工具下载之后,包含两个文件,解压到flashfxp的安装位置根目录,如下:双击打开Fl…

    2022年7月26日
    27

发表回复

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

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