当前位置: 首页 > 知识库问答 >
问题:

不一致的杰克逊“无法识别的领域”由于大写

东门宜
2023-03-14

当一个字段名的第二个字母大写时,杰克逊似乎有问题。

取值映射:

aaBoolean, true   // works
aBoolean, false   // fails
anInt, 0          // works
aString, "a"      // fails

我使用Jackson的objectMapper.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个字段的错误消息。请注意,当大写为第二个字母时,camel大小写失败:

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上失败。

对于其他堆栈溢出文章,我已经验证了字段名和getter/setter匹配(abooleangetaboolean()aabooleangetaaboolean())。

如果重要的话,下面是objectmapper的创建方式:

ObjectMapper mapper = new ObjectMapper();
mapper.setTimeZone(TimeZone.getTimeZone("CST"));

我可以贴出完整的代码,但我认为上面的就足够了。

我可以修改我的变量名来绕过这个问题,但是现在我很好奇--这是一个bug,还是我遗漏了一些关于Jackson如何处理名称转换的东西?

共有1个答案

耿锦
2023-03-14

看起来,在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; }
 类似资料:
  • 问题内容: 我使用杰克逊将JSON转换为Object类。 JSON: 对象类别: 码: 我的代码抛出这样的异常: 而且我不想在Test类上添加一个道具,我只是想让jackson转换Test中也存在的存在值。 问题答案: Jackson提供了几种不同的机制来配置“额外” JSON元素的处理。以下是将to 配置为not 的示例。 有关其他方法,请参见http://wiki.fasterxml.com/

  • 我遇到了反序列化问题: 这是我的班级: 我要反序列化的JSON是: 我得到以下例外: 我不想补充: 因为我想得到ResObj... 如果我添加注释,它会通过,但会将其设置为null。。这是我不想要的。

  • 问题内容: 我想知道为什么没有确定的合作方式。我只想解析字符串: 但是我真的很困惑应该导入什么。根据此链接,我尝试导入。但是我得到这个编译错误: 然后我尝试导入和。因此,没有编译错误,但是我得到了此运行时异常(在mapper定义行中): 请指导我,我应该导入什么才能使用。谢谢 问题答案: 使用这些依赖项 jackson-databind jackson-annotations jackson- c

  • 我想使用Spring的RestTemplate plus Jackson来使用Web服务。我已经学习了几本教程,并且已经达到了创建DAO的目的。这是我获取所有域对象的方法: 但我的Web服务不会立即返回Station对象数组,而是以这种方式返回一个更具语义的表达式: 所以我的问题是,我不知道如何“告诉”RestTemplate在“stations”指示符之后立即解析对象列表,而不创建临时对象,这似

  • 问题内容: 我正在使用Jackson,但遇到问题,当我尝试反序列化对象时,出现以下错误: 我在属性中遇到问题: 有人可以帮我吗? 问题答案: 您不能实例化一个抽象类,杰克逊也不能。您应该为Jackson提供有关如何使用具体类型实例化MyAbstractClass的信息。

  • 问题内容: 我需要反序列化JSON对象并以不区分大小写的方式访问字段。例: 这需要高效,因此调用和简化结果并不是一个好的解决方案。 问题答案: 没有自动的方法,但是您可以通过创建自定义的JsonNodeFactory来创建自定义的ObjectNodes,然后可以覆盖用于添加和访问条目的方法。