簡體   English   中英

如何在 Jackson 自定義 JSON 反序列化器中使用常規 JSON 解釋

[英]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 我顯然可以提取nameJsonNode並使用JsonNode.asText()輕松將其轉換為String

但是,我如何處理value JsonNode沒有asObject()的方法。 令人驚訝的是,它只有isObject() 我是否必須通過switch語句來確定它是什么類型的東西,以便我可以調用正確的方法,如asLong()asText()

但即使我執行switch語句,如果nodeTypeObject怎樣。 然后呢? 如果我在沒有自定義反序列化器的情況下使用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.

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