2015-09-01 115 views
0

考慮下面的JSON例子反序列化JSON成複雜的地圖對象使用傑克遜

{ 
    "key1" : { 

     "k11":["vala","valb","valc"], 
     "k12":["vald"], 
     "k13":["vale","valf"] 
    }, 
    "key2" : { 

     "key21":["valg","valh","vali"], 
     "key22":["valj"], 
     "key23":["valk","vall"] 
    } 
} 

這轉化爲一個地圖<字符串,地圖<字符串,列表<字符串>>>。

任何人都可以請讓我知道我可以如何將它轉換成這個複雜的地圖對象。我做了一個名爲constructMapType的方法,但不知道它是否處理複雜的Map類型。

回答

2

似乎很好地工作.constructMapType(Map.class, String.class, Map.class)

public static void main(String[] args) throws Exception { 
    final String json 
      = "{\n" 
      + " \"key1\" : {\n" 
      + "  \"k11\":[\"vala\",\"valb\",\"valc\"],\n" 
      + "  \"k12\":[\"vald\"],\n" 
      + "  \"k13\":[\"vale\",\"valf\"]\n" 
      + " },\n" 
      + " \"key2\" : {\n" 
      + "  \"key21\":[\"valg\",\"valh\",\"vali\"],\n" 
      + "  \"key22\":[\"valj\"],\n" 
      + "  \"key23\":[\"valk\",\"vall\"]\n" 
      + " }\n" 
      + "}"; 
    ObjectMapper mapper = new ObjectMapper(); 

    Map<String, Map<String, List<String>>> map 
      = mapper.readValue(json,TypeFactory.defaultInstance() 
        .constructMapType(Map.class, String.class, Map.class)); 

    for (String outerKey: map.keySet()) { 
     System.out.println(outerKey + ": " + map.get(outerKey)); 
     for (String innerKey: map.get(outerKey).keySet()) { 
      System.out.print(innerKey + ": ["); 
      for (String listValue: map.get(outerKey).get(innerKey)) { 
       System.out.print(listValue + ","); 
      } 
      System.out.println("]"); 
     } 
    } 
} 

你可以去一路下跌,列出所有的仿製藥下到List<String>,但它上面看到的是沒有必要的。但只是爲了顯示我的意思

TypeFactory factory = TypeFactory.defaultInstance(); 
Map<String, Map<String, List<String>>> map 
     = mapper.readValue(json, factory.constructMapType(
       Map.class, 
       factory.constructType(String.class), 
       factory.constructMapType(
         Map.class, 
         factory.constructType(String.class), 
         factory.constructCollectionType(
           List.class, 
           String.class)))); 
+0

謝謝,似乎工作。我認爲我構建的MapType不正確 – user320550