比如请求如下结构:

{"cabinGrade":"经济舱","cccode":"201","arrivalCity":"上海","departureCity":"南京","cabin":"Y"}

字段都是首字母大写,而cccode字段实际是cCCode,正常用Jackson序列化,就会得到以上结果。

Jackson序列化的几点:

  1. 序列化准备时,会收集所有可能需要序列化的属性,包含成员变量和方法名等,如上面的cCCode:属性名cCCode,方法名getCCCode
  2. 会根据可见性进行去除,此时:属性名cCCode是private,所以被移除;方法名是public的,所以保留下来
  3. 连续大写转为小写,此时:方法名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注解

标签: none

添加新评论