【问题标题】:Camel Case property names in json files are not getting mapped to Java Objectjson 文件中的 Camel Case 属性名称未映射到 Java 对象
【发布时间】:2013-08-22 22:10:11
【问题描述】:

我有一个 json 对象,其属性名称如下:itemsRequiredsortable_list。在我的 ObjectMapper 中,我有

mapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);

sortable_list 被映射到 POJO 中的适当属性,但 itemsRequired 被忽略。如果我删除PropertyNamingStrategy,则itemsRequired 有效,sortable_list 无效。如果我希望两者一起工作应该怎么做?

我正在使用 fastxml 库。我也尝试过 codehaus 的 jackson,结果相同。


更新:POJO如下,

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(Include.NON_NULL)
public class CreateList extends Header {
    private String question;
    private String placeholder;
    private String help;
    private int itemsRequired;
    private List<String> list;

    // Getter and Setter methods
}

JSON 是,

"create": {
    "heading": "Activities Available to You",
    "question": "List at least four activities at school and in your community that you may want to try out.\n",
    "placeholder": "List an activity",
    "help": "You can only have 10 list items",
    "list": [],
    "items_required": 4
  }

如果我有上面的 JSON,一切正常。但是当我将 JSON 更改为时,事情不起作用,

"create": {
    "heading": "Activities Available to You",
    "question": "List at least four activities at school and in your community that you may want to try out.\n",
    "placeholder": "List an activity",
    "help": "You can only have 10 list items",
    "list": [],
    "itemsRequired": 4
  }

itemsRequired 在后一种情况下被忽略。

我希望它在这两种情况下都能工作,无论是命名为items_required 还是itemsRequired

【问题讨论】:

  • 您可以使用 JsonProperty 注释 (jackson.codehaus.org/1.1.2/javadoc/org/codehaus/jackson/…) 能否也向我们展示您的 POJO 类和示例 JSON?
  • 更新了问题。
  • 你解决了吗?我有同样的问题
  • 正如下面的回答中提到的,我们改变了我们的命名约定以使用下划线而不是驼峰式。

标签: json jackson fasterxml


【解决方案1】:

按照建议,您可能应该对不想修改的条目使用显式注释。 我不知道为什么上面的代码不起作用:它似乎应该。您使用 Jackson 2.x 版本(com.fasterxml 包)也是正确的;尝试使用较旧的 1.x 版本没有任何好处。

您可能想要提交错误报告:这可能是一个错误。但是要知道这一点,需要一些示例代码;也许这个问题还有另一种解释。

【讨论】:

  • 更新了问题的更多细节。
  • 考虑到这一点,它不适用于命名策略,因为它们以 POJO 属性名称开头,派生预期的 JSON 名称;并且不能定义别名。确实存在一种可能的解决方法:您可以为字段和设置器指定不同的名称——一种使用下划线,另一种使用驼峰式。丑陋,但适用于反序列化(序列化可能有问题,产生 2 个属性)
  • 我会考虑这样做,但现在我们决定让我们的 json 命名保持一致,使用下划线而不是驼峰式。
  • 有意义,如果可行的话。并使事情更加一致,所以无论如何可能都是好的。
【解决方案2】:

您可以使用@JsonProperty。如果您不喜欢向目标类添加注释的想法,您可以始终使用Mixins,如果您希望它们作为蛇案例和其他camelCase.Since mixins 允许您在不实际编辑的情况下将属性名称添加到类 目标类,主要用于第三方类。

但我更喜欢custom naming strategy

因为它允许您拥有可以解析两者的策略并且将使用 ObjectMapper 注册,这将帮助您避免维护 mixins、JsonProperty 等。

【讨论】:

  • 始终欢迎提供潜在解决方案的链接,但请add context around the link,以便您的其他用户知道它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。考虑到仅仅是指向外部站点的链接Why and how are some answers deleted? 的一个可能原因。
猜你喜欢
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 2020-07-21
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多