我们都知道javabean会把属性定义成private型的,然后再提供public的get、set方法来进行访问和修改,我想问的是,当这个bean中没有对应的属性,但有一个get方法,比如getName()方法,该方法里返回一个固定的名称Tom,但类里是没有name属性的,当把这个类的一个实例对象转换成json串输出时,有"name":"Tom",这个是java默认按照get方法的命名规则生成一个对应的属性吗?如果一个类里只有get、set方法,没有一个变量属性,是不是通过set方法赋值后,将实例变量转换成json串输出,会根据get方法生成json串对应的key?这是java默认为类生成的属性吗?还是是JSON类在输出时做了相应操作啊?
看你用的是什么json库了。
java这方面没有提供标准的规范出来,因此gson、fastjson等各自按照自己的规范进行了实现。
gson是以属性为准的,即:bean转换出来的属性到底有哪些,以bean的属性为准,在获取属性的值的时候,优先使用get方法,如果没有对应的get方法,则通过反射修改访问权限,直接通过属性获取。
fastjson则是以get方法为准的,即:bean里面到底有哪些属性,它不关心,它只关心bean到底有多少的get方法,然后将方法名去掉get、首字母小写以后作为最终的json的name进行输出。
其它的json库就不清楚了。
实例对象转换成json
这个其实取决你使用什么方式将实例对象转换成json,不同的方式有不同的实现。
例如使用GSON的话,是可以使用@SerializedName来自定义的。
你好,我是用的fastJson,我是想问这是java的特性,还是转换成json串时做了转换,比如我上面说的类里面只有get、set方法,我用setName方法赋值后,是不是java默认生成了一个隐形的name字段,在java代码里,再用getNme方法就可以获取刚刚设置的名称?所以把这个对象转换成json串时,有name作为json串的key
?
@青木年华:
不是java的特性,而是你使用的类库的功能(特性?)。比如上面我提到的GSON, 你可以看看fastJson的文档应该能找到答案。
我想你的问题应该是 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转换主要用的就是反射
建议你了解下java的反射特性,json bean转换主要用的就是反射