【问题标题】:Change field case with an ObjectMapper使用 ObjectMapper 更改字段大小写
【发布时间】:2012-09-14 15:05:54
【问题描述】:

我想我需要创建一个专家 ObjectMapper 并且找不到任何示例代码来启动该过程。

JSON 的创建者使用.Netpublic 属性,因此使用带有大写首字母的字段名称。我正在将 JSON 解析为 POJO,因此我想使用小写首字母。

最后:

    public class Facet
    {
        public string Name { get; set; }
        public string  Value { get; set; }
    }

因此,我必须有:

    public class Facet {
        public String Name;
        public String Value;
    }

我更喜欢:

    public class Facet {
        public String name;
        public String value;
    }

这可以通过ObjectMapper 完成吗?

【问题讨论】:

  • 我已重新命名并删除了问题的第二部分。另一半发here

标签: java json jackson


【解决方案1】:

您的第一个问题可以通过 @JsonProperty 注释非常简单地解决:

// java-side class
public class Facet
{
    @JsonProperty("Name")
    public String name;

    @JsonProperty("Value")
    public String value;
}

现在ObjectMapper 将匹配不同大小写的字段名称。如果你不想在你的类中添加注释,你可以为你的Facet 创建一个 Mix-in 类来代替

public class FacetMixIn
{
    @JsonProperty("Name")
    public String name;

    @JsonProperty("Value")
    public String value;
}

objectMapper.getDeserializationConfig().addMixInAnnotations(Facet.class, FacetMixIn.class);

这将实现相同的效果,而无需在 Facet 类中添加额外的注释。

【讨论】:

  • 这正是我在第 1 部分中寻找的内容 :) 谢谢。我已添加到第 2 部分。这样会更容易吗?
  • 我现在已将原始问题分成两部分,所以现在这是一个完整的答案。一定要修改以反映问题的变化。
  • 哇。如果我可以对此进行多次投票,我会的。就在本周,我在 some 参数上使用前导大写字母的 API 导致的 JSON 映射问题上浪费了将近一整天。一旦我发现这是原因,这些注释就是完美的修复。
  • @BrianKnoblauch 真的很高兴帮助了另一个开发者
  • 从 jackson 2.5 开始,您可以像添加 mixin - objectMapper.addMixIn(Facet.class, FacetMixIn.class)
【解决方案2】:

可以将 Jackson ObjectMapper 配置为使用内置或自定义 PropertyNamingStrategy,而不是注释每个字段,以在 Java 属性/字段名称和 JSON 元素名称之间应用一致的转换。

例如:

myObjectMapper.setPropertyNamingStrategy(PascalCaseStrategy);

【讨论】:

  • 感谢@ProgrammerBruce 的进一步帮助。当我在新的一年晚些时候回到工作岗位时,我会检查这个工作。顺便说一句 - 是否有适合任何情况的策略?如果没有,也许你可以发布一个。我正在尝试与可能随时更改其约定的客户打交道。
  • 上次我看(大约一年前),名称转换只进行一个方向(从 Java 属性/字段名称到 JSON 元素名称,反之亦然),因此实现不区分大小写匹配并不像其他方式那么简单。
  • @Jose:它们是不同的东西。 SnakeCaseStrategy 适用于“snake_case_variables”
  • @arnaud 确实,对此感到抱歉。
【解决方案3】:

这个问题可以通过Jackson 2.5.0这样解决:

ObjectMapper mapper = new ObjectMapper();
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);

来自 javadoc:

com.fasterxml.jackson.databind.MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES

允许对传入的反序列化更宽容的功能 JSON。如果启用,bean 属性将使用它们的匹配 小写等价物,意味着任何大小写组合(传入 并且匹配的名称由小写规范化)应该可以工作。

请注意,自传入以来存在额外的性能开销 在比较之前,属性名称需要小写,对于情况 有大写字母的地方。名称的开销 然而,已经小写的应该可以忽略不计了。

功能默认禁用。

因为: 2.5

【讨论】:

  • 有没有人比较使用注释的性能差异?注释感觉更安全,但在与其他 JSON 用户(其他语言)交谈后,此选项(不区分大小写)似乎是正常的预期行为......杰克逊似乎对大小写很严格。
【解决方案4】:

只是快速更新,因为我正在寻找相同的答案和代码 sn-p objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

【讨论】:

  • 这应该是一条评论。如果您还没有足够的代表发表评论,那么感谢您的贡献,但是当您这样做时,请删除此答案并发表评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-07
  • 2019-10-04
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多