[英]How to use regular JSON interpretation inside of a Jackson custom JSON deserializer
我正在編寫自定義解串器,但不確定如何最好地處理以下情況:
我正在反序列化看起來像這樣的東西:
{
"someProp": {
"name": "some string"
"value": ****** can be anything here, including string, number, object, etc. ******
}
}
我映射到的對象有這個:
public class ObjectToMapTo {
String name;
Object value;
}
在我的代碼中,我有代表someProp
字段的JsonNode
。 我顯然可以提取name
的JsonNode
並使用JsonNode.asText()
輕松將其轉換為String
。
但是,我如何處理value
? JsonNode
沒有asObject()
的方法。 令人驚訝的是,它只有isObject()
。 我是否必須通過switch
語句來確定它是什么類型的東西,以便我可以調用正確的方法,如asLong()
或asText()
?
但即使我執行switch
語句,如果nodeType
是Object
怎樣。 然后呢? 如果我在沒有自定義反序列化器的情況下使用ObjectMapper
我如何讓JsonNode
只是一個常規的 Java Map
?
恐怕您必須在這里進行一些自定義反序列化和切換/驗證。
JsonNode 沒有 asObject() 方法。 令人驚訝的是,它只有 isObject()。
是的。 由於對象節點以{
開頭,因此確定該值是否為對象不是問題。 但是它可以構造到什么特定的類實例是無法猜測的。 這應該不足為奇。
如果 nodeType 是 Object 怎么辦。 然后呢? 如何獲取 JSON 中為值指定的任何內容
如果有一個字段 - 比如說type
- 告訴你可以在自定義反序列化器中輕松完成的類型。 因此,如果您有權添加它,那么您可以在那里提供整個類名以在您的反序列化器中實例化。
否則,我認為您能做的最好的事情就是將任意對象實例化為Map
的實例或僅作為TreeNode
實例化。
您可以為反序列化器注釋字段value
(因此不是父級):
@Getter @Setter
public class ObjectToMapTo {
private String name;
@JsonDeserialize(using = MyDeserializer.class)
private Object value;
}
在您檢查它不是數組或值之后,在您的反序列化器中,例如:
Object o;
TreeNode valueTreeNode = jp.readValueAsTree();
// check if array or valueNode
// but if is object
ObjectMapper om = new ObjectMapper();
o = om.treeToValue(valueTreeNode, Map.class);
return o;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.