微服务接口字段名与定义不符的问题
比如请求如下结构:
{"cabinGrade":"经济舱","cccode":"201","arrivalCity":"上海","departureCity":"南京","cabin":"Y"}
字段都是首字母大写,而cccode字段实际是cCCode,正常用Jackson序列化,就会得到以上结果。
Jackson序列化的几点:
- 序列化准备时,会收集所有可能需要序列化的属性,包含成员变量和方法名等,如上面的cCCode:属性名cCCode,方法名
getCCCode
- 会根据可见性进行去除,此时:属性名cCCode是private,所以被移除;方法名是public的,所以保留下来
- 连续大写转为小写,此时:方法名
getCCCode
去掉get,剩CCCode,然后连续的CCC转成小写,得到cccode
这就是为什么上面第一个例子输出中会存在"cccode"
加上
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE,
isGetterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE)
注明了其所有get/set/is
等方法不可见,所有field可见,使Json序列化时会和属性名称保持一致。
或者在字段名上加上@JsonProperty(value = "cCCode")
, 输出的结果是:
{"cccode":"201","arrivalCity":"上海","cabin":"Y","cabinGrade":"经济舱","departureCity":"南京","cCCode":"201"}
可以看到上面有存在"cCCode"和"cccode"两个,其中"cccode"来自方法名,"cCCode"来自@JsonAutoDetect
注解