22

我想我需要创建一个专家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吗?

4

4 回答 4

27

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

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

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

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

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

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

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

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

于 2012-09-14T18:19:43.910 回答
15

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

例如:

myObjectMapper.setPropertyNamingStrategy(PascalCaseStrategy);
于 2013-01-02T21:25:24.740 回答
8

这个问题可以这样解决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

于 2016-08-06T15:04:19.260 回答
0

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

于 2019-05-01T22:34:58.073 回答