jackson 使用ObjectMapper更改字段大小写

syqv5f0l  于 2022-11-08  发布在  其他
关注(0)|答案(5)|浏览(474)

我想我需要创建一个MavenObjectMapper,但找不到任何示例代码来启动这个过程。
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来完成,对吗?

kse8i1jr

kse8i1jr1#

您的第一个问题可以通过@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类中添加额外的注解。

iovurdzv

iovurdzv2#

可以将JacksonObjectMapper配置为使用内置或自定义的PropertyNamingStrategy,而不是对每个字段进行注解,以便在Java属性/字段名称和JSON元素名称之间应用一致的转换。
例如:

myObjectMapper.setPropertyNamingStrategy(PascalCaseStrategy);
rkue9o1l

rkue9o1l3#

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

6ie5vjzr

6ie5vjzr4#

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

thtygnil

thtygnil5#

自2.13版起使用构建器:

XmlMapper xmlMapper = (XmlMapper) getObjectMapper();

private ObjectMapper getObjectMapper() {
    return XmlMapper.builder()
        .configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true)
        .build();
}

相关问题