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

当字段名称的第二个字母大写时,Jackson 似乎有问题。


获取值的映射:


aaBoolean, true   // works

aBoolean, false   // fails

anInt, 0          // works

aString, "a"      // fails

我使用 Jackson'sObjectMapper.convertValue(map)创建了一个 Java 对象。下面是一段 Java 代码:


private boolean aaBoolean;  // GOOD

public 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 如何处理名称转换的一些信息?


MMMHUHU
浏览 385回答 1
1回答

汪汪一只猫

看起来通过 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; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java