为了账号安全,请及时绑定邮箱和手机立即绑定

由于大写,杰克逊“无法识别的字段”不一致

由于大写,杰克逊“无法识别的字段”不一致

MMMHUHU 2021-12-22 20:44:33
当字段名称的第二个字母大写时,Jackson 似乎有问题。获取值的映射:aaBoolean, true   // worksaBoolean, false   // failsanInt, 0          // worksaString, "a"      // fails我使用 Jackson'sObjectMapper.convertValue(map)创建了一个 Java 对象。下面是一段 Java 代码:private boolean aaBoolean;  // GOODpublic boolean getAaBoolean() { return aaBoolean; }public void setAaBoolean(boolean value) { this.aaBoolean=value;}private boolean aBoolean;  // FAILS!!! Jackson "Unrecognized field"public boolean getABoolean() { return aBoolean; }public void setABoolean(boolean value) { this.aBoolean=value;}我收到一条包含所有 18 个字段的错误消息。请注意,当大写是第二个字母时,驼峰案例失败:Unrecognized field "aBoolean" (class Test), not marked as ignorable (18 known properties: "anInt", "anullableBoolean", "aboolean", "aaBoolean", "lastModifiedDate", "adate", "anullableDate", "astring", "anullableString", "createdDate", "anullableFloat", "id", "along", "anullableLong", "createdBy", "anullableInt", "lastModifiedBy", "afloat"])如果我更改aBoolean为aaBoolean,则通过并且 Jackson 失败aString。根据其他 Stack Overflow 帖子,我已验证字段名称和 getter/setter 匹配(aBooleanisgetABoolean()和aaBooleanis getAaBoolean())。如果重要,这里是如何ObjectMapper创建的:ObjectMapper mapper = new ObjectMapper();mapper.setTimeZone(TimeZone.getTimeZone("CST"));我可以发布完整的代码,但我认为以上就足够了。我可以修改我的变量名来解决这个问题,但现在我很好奇 - 这是一个错误还是我错过了关于 Jackson 如何处理名称转换的一些信息?
查看完整描述

1 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

看起来通过 v2.9 的默认 Jackson 行为是将任何领先的大写 getter/setter 方法小写。所以“getURLtoServer”变成了“urltoServer”。

Jackson 源代码在这里执行:https : //github.com/FasterXML/jackson-databind/blob/2.9/src/main/java/com/fasterxml/jackson/databind/util/BeanUtil.java#L246

但是,JavaBean 规范说,如果前两个字符是大写的,则不要更改任何大小写。因此,“getURLtoServer”的 JavaBean 将是“URLtoServer”。

Jackson 引入了 MapperFeature.USE_STD_BEAN_NAMING 作为强制执行 JavaBean 规范的这一部分的选项。但是,当它成为默认行为时,它似乎在 v3.x 中被删除:https : //github.com/FasterXML/jackson-databind/issues/1772

因此,对于您的情况,看起来您可以在不使用 USE_STD_BEAN_NAMING 的情况下获得 JSON 字符串“aboolean”,或者使用 USE_STD_BEAN_NAMING 获得 JSON 字符串“ABoolean”。

另一种选择是手动指定您想要的内容:

@JsonProperty("aBoolean")
public boolean getABoolean() { return aBoolean; }


查看完整回答
反对 回复 2021-12-22
  • 1 回答
  • 0 关注
  • 384 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号