2012-09-14 65 views
20

我认为我需要创建专家ObjectMapper,并且找不到任何示例代码来启动该过程。使用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

+1

我已经改名并去除问题的第二部分。另一半是张贴[这里](http://stackoverflow.com/q/12450404/823393) – OldCurmudgeon

回答

23

你的第一个问题可以用@JsonProperty注解非常简单处理:

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

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

现在ObjectMapper将匹配了不同的外装的字段名。如果你不想添加注解到您的类,你可以为你Facet创建一个混合类来立场在

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

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

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

这样就实现了同样的事情,而不需要额外的注解Facet班。

+0

这正是我在第1部分寻找:)谢谢。我已经添加到第2部分。这是否更容易? – OldCurmudgeon

+0

我已经把原来的问题分为两部分,所以这是一个完整的答案。通过一切手段修改以反映问题的变化。 – OldCurmudgeon

14

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

例如:

myObjectMapper.setPropertyNamingStrategy(PascalCaseStrategy); 
+0

感谢@ProgrammerBruce为您提供进一步的帮助。当我在新的一年晚些时候回到工作岗位时,我会检查这些作品。顺便说一句 - 有没有一种策略可以匹配任何情况?如果不是,也许你可以发布一个。我正试图与一位可以随时更改约定的客户打交道。 – OldCurmudgeon

+0

最后我看了(大约一年前),名称转换只能沿着一个方向进行(从Java属性/字段名称到JSON元素名称,反之亦然),因此实施不区分大小写的匹配并不像否则可能是。 –

+0

@Jose:他们是不同的东西。 SnakeCaseStrategy的确是“snake_case_variables” – dagnelies

5

这个问题可以从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