如何覆盖JacksonObjectMapper以识别getter/setter方法名

afdcj2ne  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(84)

我有一些通过avro模式生成的Pojo类。问题是模式中的字段名是用大写字母的第一个字符声明的。我正在接收一个JSON字符串,在JSON字符串中,每个键的名称都以大写字母开头,因此Jackson无法Map数据。
有没有什么方法可以覆盖Jackson解析器的逻辑,只使用get + FieldName和set + FieldName在pojo中找到getter/setter。
Bellow是示例POJO类和JSON,我正试图解析它。

POJO:

public class Sample {
    private java.lang.CharSequence Field1;
    private java.lang.CharSequence Field2;
    private java.lang.CharSequence Field3;

    public java.lang.CharSequence getField1() {
        return Field1;
    }

    public void setField1(java.lang.CharSequence Field1) {
        this.Field1 = Field1;
    }

    public java.lang.CharSequence getField2() {
        return Field2;
    }

    public void setField2(java.lang.CharSequence Field2) {
        this.Field2 = Field2;
    }

    public java.lang.CharSequence getField3() {
        return Field3;
    }

    public void setField3(java.lang.CharSequence Field3) {
        this.Field3 = Field3;
    }
}

JSON:

{
  "Field1": "Value1",
  "Field2": "Value2",
  "Field3": "Value3"
}

解析JSON的代码:

String json = = "";
ObjectMapper objectMapper = new ObjectMapper();
Sample sample = objectMapper.readValue(json, Sample.class);

如果我传递下面的JSON,那么它工作得很好。

{
  "field1": "Value1",
  "field2": "Value2",
  "field3": "Value3"
}

但是我收到的JSON是以前的格式,我不想写一段代码来将每个JSON键的第一个字符转换为小写(这仍然会为一些字段创建一个问题,其中多个起始字母是大写的)。

kyxcudwk

kyxcudwk1#

您应该能够利用Jackson的MixIn特性来实现一个抽象类或接口,该抽象类或接口提供Sample类中的getter方法。然后,您可以将@JsonProperty注解应用于接口getter方法,并将MixIn应用于objectMapper。你可以看看hereSee also
您可以尝试:

public interface SampleMixIn {
    @JsonProperty("Field1")
    CharSequence getField1();
    @JsonProperty("Field2")
    CharSequence getField2();
    @JsonProperty("Field3")
    CharSequence getField3();
}

然后当你调用你的对象Map器时:

mapper.addMixIn(Sample.class, SampleMixIn.class);
mapper.readValue(json, Sample.class); //or whatever other method you want to call to map/read

您可以使用以下特性(仅在Jackson2.5及以后版本中可用)允许传入JSON的Map不区分大小写。另请参阅this thread,它给出了其他可能的解决方案。

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

相关问题