首页新闻找找看学习计划

javabean的疑惑

0
悬赏园豆:10 [已解决问题] 解决于 2017-12-18 16:18

我们都知道javabean会把属性定义成private型的,然后再提供public的get、set方法来进行访问和修改,我想问的是,当这个bean中没有对应的属性,但有一个get方法,比如getName()方法,该方法里返回一个固定的名称Tom,但类里是没有name属性的,当把这个类的一个实例对象转换成json串输出时,有"name":"Tom",这个是java默认按照get方法的命名规则生成一个对应的属性吗?如果一个类里只有get、set方法,没有一个变量属性,是不是通过set方法赋值后,将实例变量转换成json串输出,会根据get方法生成json串对应的key?这是java默认为类生成的属性吗?还是是JSON类在输出时做了相应操作啊?

青木年华的主页 青木年华 | 初学一级 | 园豆:133
提问于:2017-08-28 12:15
< >
分享
最佳答案
0

看你用的是什么json库了。

java这方面没有提供标准的规范出来,因此gson、fastjson等各自按照自己的规范进行了实现。

gson是以属性为准的,即:bean转换出来的属性到底有哪些,以bean的属性为准,在获取属性的值的时候,优先使用get方法,如果没有对应的get方法,则通过反射修改访问权限,直接通过属性获取。

fastjson则是以get方法为准的,即:bean里面到底有哪些属性,它不关心,它只关心bean到底有多少的get方法,然后将方法名去掉get、首字母小写以后作为最终的json的name进行输出。

其它的json库就不清楚了。

收获园豆:10
依然菜刀 | 菜鸟二级 |园豆:249 | 2017-11-13 16:47
其他回答(3)
0

实例对象转换成json

这个其实取决你使用什么方式将实例对象转换成json,不同的方式有不同的实现。

 

例如使用GSON的话,是可以使用@SerializedName来自定义的。

写代码的小2B | 园豆:4346 (老鸟四级) | 2017-08-28 13:51

你好,我是用的fastJson,我是想问这是java的特性,还是转换成json串时做了转换,比如我上面说的类里面只有get、set方法,我用setName方法赋值后,是不是java默认生成了一个隐形的name字段,在java代码里,再用getNme方法就可以获取刚刚设置的名称?所以把这个对象转换成json串时,有name作为json串的key

?

支持(0) 反对(0) 青木年华 | 园豆:133 (初学一级) | 2017-08-28 13:59

@青木年华: 

不是java的特性,而是你使用的类库的功能(特性?)。比如上面我提到的GSON,  你可以看看fastJson的文档应该能找到答案。

支持(0) 反对(0) 写代码的小2B | 园豆:4346 (老鸟四级) | 2017-08-28 14:04
2

 

我想你的问题应该是  bean和 json转换的问题,不是java特性的问题。

bean和json转换的时候,可以根据不同的设置进行不同的转换,比如使用jackson,

你可以设置根据  属性  转换 还是根据  get方法和is方法  转换,

可以设置当属性值为null的时候,转换的json包含该字段,也可以  自动忽略属性值为null的字段

这些都是bean转json的框架的特性,不同的框架提供的不同的序列化(bean to json) 和反序列化方法(json to bean)。

 

至于你说的“我用setName方法赋值后,是不是java默认生成了一个隐形的name字段,在java代码里,再用getNme方法就可以获取刚刚设置的名称?”

你这种说法其实矛盾的,没有这个属性,你setName方法set到哪儿去,get方法又上哪儿去获得这个值?

如果你getName方法返回的是固定值,那么如果你的json转换框架正好设置了通过get方法来转换,那么转换出来的json串就会有name这个key,并不是生成了一个隐形的name字段。

 

建议你了解下java的反射特性,json bean转换主要用的就是反射

 

苍枫露雨 | 园豆:1027 (小虾三级) | 2017-08-28 20:24
0

建议你了解下java的反射特性,json bean转换主要用的就是反射

鸿燕藏锋 | 园豆:568 (小虾三级) | 2017-08-30 20:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册