2013-04-02 33 views
0

我試圖將json字符串解碼爲Map。Java解碼JSON

我知道有很多這樣的問題,但我需要非常具體的格式。例如,我有JSON字符串:

{ 
    "map": { 
     "a": "b", 
     "c": "d", 
    }, 
    "map2": { 
     "aa": "bb", 
     "cc": "dd", 
    }, 
    "something": "a", 
    "something2": "b" 
} 

,我需要有這樣的結果:

"map.a" => "b" 
"map.c" => "d" 
"map2.aa" => "bb" 
"map2.cc" => "dd" 
"something" => "a" 
"something2" => "b" 

進出口確保密鑰將不包含任何點。我查看了幾個JSON庫,但是我不需要這麼多的函數,只是解碼並存儲在Java地圖中。如果沒有簡單的方法,我會爲此編寫自己的算法,我希望它不會這麼難......

感謝您的任何幫助。

+0

即使你使用自己的算法來生成點標記的鑰匙,我還是會建議你使用解碼器庫。有太多的邊緣案例可能導致令人討厭的錯誤,如字符串轉義規則。 – Philipp

回答

1

我用org.codehaus.jackson。執行以下操作:

HashMap<String, Object> content = null; 
    HashMap<String, String> result = new HashMap<String, String>(); 

    try { 
     JsonFactory factory = new JsonFactory(); 
     ObjectMapper mapper = new ObjectMapper(factory); 
     TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() { 
     }; 
     content = mapper.readValue(jsonString, typeRef); 

    } catch (Exception ex) { 
     System.out.println("Exception : " + ex); 
    } 
    // now content has everything inside 
    for(String s : content.keySet()){ 
     Object obj = content.get(s); 
     if(obj instanceof String){ 
      result.put(s, (String)obj); 
     } else { 
      HashMap<String,String> hm = (HashMap<String,String>)obj; 
      for(String s2: hm.keySet()){ 
       result.put(s+"."+s2, hm.get(s2)); 
      } 

     } 
    } 

編輯:測試和工作

+0

正是我所需要的!謝謝! :) –

+0

歡迎:) – anvarik

1

爲了準確地解析JSON,你需要爲它定義一個合適的解析器,它們並不是非常難以編寫,而只是耗時。我的建議是找到一個相當輕量級的JSON解析器,然後爲它編寫一個裝飾器來獲得你正在尋找的地圖格式。儘管如果你正在處理大量的JSON,你不幸的是會增加開銷。

1

我不認爲你會發現一個開箱即用的解決方案,因爲這是一個非標準的表示。我的建議是使用JSON庫將JSON字符串轉換爲Java Map,然後對該Map進行深度優先遍歷,以將其轉換爲所需的表示形式。