2012-10-17 59 views
9

我正在使用org.eclipse.jetty.util.ajax.JSON來解析JSON文本。 但是JSON.parse(字符串)方法產生一個對象,我需要它作爲一個地圖。 在內部,它正是所提到的類的一個對象。 但是,如何將一個對象轉換爲一個Map,而無需構建一個新對象或獲取未經檢查的強制轉換警告?將Java對象轉換爲Java地圖<String,Object>

目前,我發現只有一個解決方案沒有未經檢查的轉換警告,但與構建一個新的地圖,這實際上當然不是一個鑄造。

private Map<String,Object> getMap(String string) { 
    HashMap<String,Object> result = new HashMap<>(); 
    Object object = JSON.parse(string); 
    if (object instanceof Map) { 
     Map<?,?> map = (Map)(object); 
     for (Map.Entry<?,?> entry : map.entrySet()) { 
      String key = entry.getKey().toString(); 
      Object value = entry.getValue(); 
      result.put(key,value); 
     } 
    } 
    return result; 
} 

那麼是否有一種方法可以在沒有未經檢查的轉換警告的情況下正確轉換它?

+1

類型檢查在類型鑄造之前可能擺脫警告。 –

+1

@JanDvorak之前的類型檢查沒有幫助 – Bohemian

+0

@JanDvorak - 由於類型刪除,您不能鍵入檢查特定類型的通用映射。 (例如,使用類型檢查,你不能區分'Map 'Map ')。 –

回答

11

編譯器不能保證轉換是安全的。既然你是一個做擔保,你應該使用@SuppressWarnings("unchecked")

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/SuppressWarnings.html

由於@TedHopp指出,該庫是應該使用的方式是,你在returnd Object投每個值的類型你知道它是(但你必須投入你檢索的每一個屬性)看到這裏的映射http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/util/ajax/JSON.html

它帶來的一點是,你是保證這個JSON對象只包含其他JSON對象(映射到對象)

因此,如果由於某種原因,你要通過輸入

// properties are not quoted for readability 
{ a: 2, b : {c:3} } 

您的代碼會失敗,當您嘗試

map.get("a") 

所以請記住你是一個什麼樣保證進入一個無效的轉換異常你正在解析爲JSON的字符串

如果你不能保證它,你不能創建你想要的這個getMap函數。你必須在知道特定對象是什麼類型的地方進行施法(和@SupressWarnings)。

對於某些類型的安全使用JSON工作時,你應該瞭解

這些類允許您讀取JSON直接轉換成Java類

+1

另請參見[this thread](http://stackoverflow.com/questions/1774356/casting-from-object-in-java-without-getting-an-unchecked - 警告),基本上是相同的答案。您可以使用非泛型「Map」並從任何「get」調用中轉換返回值,而不是抑制警告。 –

+0

但實際上可能有些情況下,我無法保證未經檢查的演員。只有在輸入字符串在{{}內時,該投射纔有效,而在其他情況下,它可能不是Map。 – KoichiSenada

+0

@KoichiSenada如果你可以保證輸入格式爲{{a:{...},b:{...}}',那麼你只能使用你的'getMap'函數,那就是屬性頂層是JSON對象 –

相關問題