簡體   English   中英

如何使用標准設置器反序列化JSON字符串

[英]How to deserialize JSON string using standard setters

我正在使用jackson-core,databind,批注2.3.3 jar。 我有以下簡單的課程

public class ClassA {
    private int value;

    public int getValue() {
        return this.value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}

以下是嘗試將JSON字符串反序列化到對象的代碼:

import com.fasterxml.jackson.databind.ObjectMapper;

...

final ObjectMapper objectMapper = new ObjectMapper();
ClassA request = objectMapper.readValue("{\"Value\": 1}", ClassA.class);

但是我收到以下錯誤:com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException:無法識別的字段“ Value”(類ClassA),未在[來源:java。]標記為可忽略(一個已知屬性:“ value”)。 io.StringReader@3bff5976; 行:1,列:12](通過參考鏈:ClassA [“ Value”])

如果我將JSON字符串更改為小寫,則可以正常工作。 我以為Jackson可以通過遵循setter約定將值映射到setter。 我知道我可以在ClassA中添加JsonProperty批注以使其正常工作,但是我無法根據自己的情況修改ClassA。

我還嘗試在調用readValue之前顯式啟用以下映射功能,但仍然出現相同的錯誤:

import com.fasterxml.jackson.databind.MapperFeature;

...

objectMapper.enable(MapperFeature.AUTO_DETECT_GETTERS);
objectMapper.enable(MapperFeature.AUTO_DETECT_SETTERS);

我如何讓Jackson綁定到標准的getter / setter(getXxx和setXxx),而不必對綁定的類指定注解?

謝謝!

由於傑克遜提供了默認的PropertyNamingStrategy因此似乎正在發生這種情況。 文檔中

在沒有注冊的自定義策略的情況下,將使用默認的Java屬性命名策略,該策略將保留字段名稱,並從方法(以及小寫的大寫字母初始序列)中刪除set / get / is前綴。

映射器默認使用Java默認屬性命名策略。 如果您的JSON屬性為Pascal Case(不確定,因為您僅提供了1個屬性),則可以為映射器提供PascalCaseStrategy

final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setPropertyNamingStrategy(new PropertyNamingStrategy.PascalCaseStrategy());
ClassA request = objectMapper.readValue("{\"Value\": 1}", ClassA.class);

Jackson遵循bean命名約定。

我知道我可以在ClassA添加JsonProperty批注以使其正常工作,但是我無法根據自己的情況修改ClassA

那就是mixin派上用場的地方。 創建一個具有與ClassA相同的方法聲明(例如,相同的getter)的abstract類,並使用適當的@JsonProperty批注@JsonProperty批注。 然后,您可以在ObjectMapper和voila中注冊mixin! 現在, ObjectMapper將使用mixin類作為序列化和反序列化ClassA的模板。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM