背景

web工程中,数据交互是不可避免的,相比xml,json是现在流行的数据交互。

在调试接口中,发现返回字段的大小写不是我所期望的,原本应该返回的nNum字段变成了nnum,这样就导致和前端约定的有出入了。

jackson

web工程中,比较流行的框架是springMVC+spring+mybatis。数据交互由springMVC完成,但是springMVC也不是自己序列化json的,它将这个工作交给了jackson。

jackson对object进行序列化的过程中确实存在key大写变小写的问题。看我娓娓道来。

序列化原理

这里只对jackson的序列化原理做阐述,其他的序列化工具不一定是相同的原理,不可套用。

众所周知,json的数据格式是,key:value的形式,现在的问题就出现在key的大小写这边。

下面我们对其进行一定的测试:

object中的field都有其对应的get,set方法,一般都会选择是IDE自动生成。如下图所示:

java json序列化父类 jackson序列化json原理_序列化

其运行的结果当然没有问题:

java json序列化父类 jackson序列化json原理_jackson转换json大写_02

jackson在序列化的时候如何定义key呢?

jackson会获取field对应的get方法方法名,比如getXxx,然后进行将get进行截断,变成Xxx,最后将其小写,变成xxx。

如果我们将xxx改成xXx,但是没有更改其get方法,key仍然是xxx,并不是我们期望的xXx:

java json序列化父类 jackson序列化json原理_spring_03

网上的很多博客基本都只提及大写转小写,其实不然,jackson只会将连续的大写转换成小写,如果中间断了,之后的大写字符也不会处理了,并且jackson是从开头检测的,如果开头就是小写,那么之后的大写字符也不会处理了。测试如下:

java json序列化父类 jackson序列化json原理_jackson转换json大写_04

java json序列化父类 jackson序列化json原理_jackson转换json大写_05

如何避免

正如网上的博客所说,你需要在field和其对应的get方法上加上对应的标签,然后jackson在序列化的时候就会以你的field名称为key:

java json序列化父类 jackson序列化json原理_get方法_06

总结spring的序列化工作是由jackson完成(你也可以配置其他的序列化工具)

jackson序列化的key定义与field名称无关,反而和其get方法名称有关

jackson的大写转小写从开头检测,并且一定是连续的

jackson的这种序列化机制是可以避免的,这样可以以field名称作为key