[英]Using Jackson to deserialize into a Map
我有一個 JSON object 有兩個屬性:“key”是一個字符串,“value”可以反序列化為一個 Java bean。
{ "key": "foo", "value": "bar" }
問題是,給定這些對象的列表,我可以將其反序列化為 Map 嗎?
[{"key": "foo1", "value": "bar1"}, {"key": "foo2", "value": "bar2"}] -> Map<String, String>
目前使用 Jackson-databind 2.1
您可以輕松地將上述JSON轉換為List<Map<String, String>>
:
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.CollectionType;
public class JacksonProgram {
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
CollectionType mapCollectionType = mapper.getTypeFactory().constructCollectionType(List.class, Map.class);
List<Map<String, String>> result = mapper.readValue(json, mapCollectionType);
System.out.println(result);
}
}
上面的程序打印:
[{key=foo1, value=bar1}, {key=foo2, value=bar2}]
由於您的結構不匹配,因此有兩個基本選項:
JsonNode
或List<Map<String,Object>>
),然后使用簡單的代碼轉換為所需的類型 Jackson不支持廣泛的結構轉換(有一些簡單的轉換,例如@JsonUnwrapped
),因此這種功能不太可能添加到databind模塊中。 盡管可以將其添加為擴展模塊,但是如果通常使用這些“智能地圖”類型的結構(不幸的是,它們似乎是)。
有同樣的問題,很驚訝 Jackson 無法本地處理它。 我采用的解決方案是在我試圖編組的 object 上創建一個自定義設置器:
public class somePojo {
private Map<String, String> mapStuff;
...
public void SetMapStuff(List<Map<String, String> fromJackson){
mapStuff= new HashMap<>();
for (Map<String, String> pair : fromJackson) {
put(pair.get("key"), pair.get("value"));
}
}
}
Jackson 足夠聰明,可以找到該 setter 並愉快地將其傳遞給 List。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.