簡體   English   中英

使用 Jackson 反序列化成 Map

[英]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}]

由於您的結構不匹配,因此有兩個基本選項:

  1. 使用兩階段處理:使用Jackson綁定到確實匹配的中間表示形式(可以是JsonNodeList<Map<String,Object>> ),然后使用簡單的代碼轉換為所需的類型
  2. 編寫自定義序列化器和/或反序列化器

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.

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