我有一個用例,我需要支持將多種型別的值插入到 ObjectNode(Jackson ObjectMapper)中,但是當我嘗試使用泛型時它有錯誤 Cannot resolve method 'put(java.lang.String, T)'
public static <T> JsonNode of(String key, T value) {
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode root = objectMapper.createObjectNode();
root.put(key, value); // <== error shows up on this line
return root;
}
底層ObjectNode不支持多種型別的值,例如<String, Boolean>,<String, String>,<String, Integer>等。
對于完整的檔案杰克遜
這樣做的正確方法是什么?謝謝。
uj5u.com熱心網友回復:
如果您查看ObjectNode#put方法的簽名,您將看到
public JsonNode put(String fieldName, JsonNode value)
第二個引數實際上系結到一個特定的型別,它是JsonNode ,而不僅僅是 any T(就像你的方法允許的那樣)。
因此,由于型別擦除 - 編譯器必須確保您在編譯時提供兼容的型別,我建議您在方法上設定合適的界限,例如:
public static <T extends JsonNode> JsonNode of(String key, T value) {
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode root = objectMapper.createObjectNode();
root.set(key, value);
return root;
}
確保您的方法只接受 JsonNode 或其后代。
小注意事項 1:每次呼叫方法時都實體化 ObjectMapper 不是一件好事,因為創建物件有點昂貴,最好將其設為欄位。
小注意事項 2:自 2.4 版起不推薦使用ObjectNode#put方法,建議改用ObjectNode#set。
uj5u.com熱心網友回復:
問題是通過型別擦除,編譯器將為您的泛型方法生成以下方法。
public static JsonNode of(String key, Object value) {
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode root = objectMapper.createObjectNode();
root.put(key, value); // <== error shows up on this line
return root;
}
根據杰克遜檔案,沒有這種方法put(String key, Object value)。
of(String key, T value)我不會呼叫方法,而是執行以下操作:
ObjectNode root = new ObjectMapper().createObjectNode();
root.put(key, value);
或者您可以撰寫多個多載方法of(...)。
uj5u.com熱心網友回復:
還有另一種方法適用于任何 json 物件:
Map<String, Object> map = new ObjectMapper().readValue(json, new TypeReference<HashMap<String,Object>>() {});
值中的物件可以是任何值物件(String、Integer等),另一個Map<String, Object>是嵌套物件或List<Object>/List<Map<String, Object>>等等,直到任何深度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/384262.html
