2013-11-20 63 views
1

我有一個JSON對象有兩個屬性:「key」是一個字符串,「value」可以被反序列化成一個Java bean。使用傑克遜反序列化到一個映射

{ "key": "foo", "value": "bar" } 

問題是,給定一個這樣的對象的列表,我可以反序列化成一個Map嗎?

[{"key": "foo1", "value": "bar1"}, {"key": "foo2", "value": "bar2"}] -> Map<String, String> 

目前使用傑克遜,數據綁定2.1

+0

請完全解決您的問題。哪裏有問題。一個人看不到你想要做什麼。 – Lion

+0

基本上,您希望將數據的屬性列表/ XML安排轉換爲更簡單的形式,其中「鍵」和「值」條款將被刪除,以便您獲得「{」foo1「:」bar1「,」foo2「 :「bar2」,...}'。這可以通過外部數組的簡單循環來完成,但是我已經(在Objective-C中)看到了其他「聰明」(儘管不一定更清潔或更高效)的方式來做到這一點。除非你是爲了刺激精神,否則我會建議簡單的循環。 (如果它不明顯,使用Jackson或其他任何工具轉換成地圖列表,然後遍歷列表以構建新地圖。) –

回答

4

您可以輕鬆地轉換上述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}] 
+3

這不是他想要的。 –

1

因爲你的結構不匹配,你有兩個基本選項:

  1. 使用兩階段處理:用傑克遜結合成中間表示的是確實匹配(其可以是JsonNodeList<Map<String,Object>>),然後執行轉換成所需類型的簡單代碼
  2. 寫自定義序列和/或解串器

傑克遜不支持廣泛的結構轉換(有一些簡單的轉換,如@JsonUnwrapped),所以這種功能不太可能被添加到數據綁定模塊。雖然它可以作爲擴展模塊添加,但如果這些「智能地圖」類型的結構是常用的(他們似乎是,不幸)。