因为现在公司的后台是.net,而他们的命名方式并不是Java的JavaBean,。这时如果还是按照以前的方式实体的创建使用JavaBean的方式,在序列化的时候就会出现很多不必要的麻烦-———当我们需要传递序列化的参数给后台时就会发现变量名首字母全部都成了小写。
先说一说我刚开始的解决方式吧,因为我之前就知道使用 @JSONField 注解可以改变变量名称,于是我便使用这个注解将参数序列化时的名称改为首字母大写,刚开始参数很少没有感觉,但是随着参数的增加(已经达到十几个了),我觉得这种方式是在太蠢了,实在是一个没有意思的体力活,于是我查了点资料加上自己的测试发现:
fastjson在序列化时已经为考虑到了Model的两种创建方式:
1.熟悉的JavaBean方式-也就是使用驼峰法(变量名首字母小写),同时变量添加Get与与Set方法,变量的访问方式设置为私有:
这时fastjson在序列化是会根据get方法的第三的字符后的字符串来判断变量名称,同时第一个参数会设置成小写,fastjson中的TypeUtils中的静态变量
compatibleWithJavaBean(当做JavaBean来处理)会设置成True
2.变量的首字母是大写,不需要Get Set方法,使用构造方法给field赋值,或者使用直接赋值的方式(使用"."来赋值),变量访问方式为公有:
这时fastjson在序列化时会根据字段的名称来判断变量的名称(fastjson中称为FieldName).fastjson中的TypeUtils中的静态变量
compatibleWithFieldName(根据FieldName来输入输出数据)会设置成True
3.如果两个条件同时满足的话将会同时使用两种方式来处理。
最后我自己的使用方案:
刚开始的时候我很想坚持自己的习惯方式(使用JavaBean),但是实在是太麻烦了——每个字段都需要添加FieldName,实在是太累了,我受不了放弃了,
最后我想了一下,为什么我要这么坚持Java的命名方式呢?合适的不就是最好的吗?于是我决定也按照后台的命名规则来创建实体类,但是我还是想保留一些
JavaBean的优点:可以在Set方法中做一些其他的处理操作,于是当我需要Set方法时我保留了字段的反序列化(添加Get Set方法),但是我又不想在序列化
时存在首字母小写的字段,于是我便在Get方法上添加注解-@JSONField(serialize=false)。
这是我目前的解决方案,或许在我对fastjson源码更加了解(只看了一点点...有个Config类没细看可能能解决我的疑惑,maybe )
或者经验更丰富后我能有更好的解决方式。
原文链接:https://www.f2er.com/json/289106.html