![](/img/trans.png)
[英]Jackson: deserialize with Builder along with standard setters/getters?
[英]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.