2013-02-19 75 views
0

我需要從自定義類的toStringHashMap和浮點值創建JSONObject。我想下面希望它只是工作的代碼:HashMap中的JSONObject - 強制轉換爲字符串失敗

public class MyClass { 
    ... 
    public String toString() { 
     return "a nice string" 
    } 
} 


HashMap<MyClass,Float> map = new HashMap<MyClass,Float>(); 
map.put(...); 

JSONObject json = new JSONObject(map); 

,但我得到:

java.lang.ClassCastException: MyClass cannot be cast to java.lang.String 

什麼是創建這個JSONObject的最佳方式?謝謝。

+0

這JSON庫您使用? – atamanroman 2013-02-19 17:40:55

回答

2

您需要更改此:

HashMap<MyClass,Float> map = new HashMap<MyClass,Float>();

HashMap<String,Float> map = new HashMap<String,Float>();

如你所說的 「自定義類的toString的HashMap和一個浮點值

你還沒有提到你如何將值放入hashmap中。

但是,如果你使用你的自定義類的toString方法,那麼你應該把它想:

MyClass m = new MyClass(); 
map.put(m.toString,123.45f); 
+0

嗯,我不能將HashMap改成'',因爲我正在用這個類做其他事情。也許我可以創建一箇中間HashMap,其中我複製了原始值的值。在那一點上,我應該創建一個'JSONObject',然後將值直接放到那裏。 – gozzilli 2013-02-19 17:49:45

+0

所以你可以直接把這個對象放在地圖上:'map.put(m,123.45f);' – Abubakkar 2013-02-20 04:23:23

1

好像你正在使用的org.json庫。如果你看看JSONObject類的代碼,顯然他們沒有使用泛型。

public JSONObject(Map map) { 
    this.map = new HashMap(); 
    if (map != null) { 
     Iterator i = map.entrySet().iterator(); 
     while (i.hasNext()) { 
      Map.Entry e = (Map.Entry)i.next(); 
      Object value = e.getValue(); 
      if (value != null) { 
       this.map.put(e.getKey(), wrap(value)); 
      } 
     } 
    } 
} 

這張地圖看起來與String鍵,並通過他們來管理獨特StringkeyPool地圖的外觀的Object值來處理條目。在評論中,它還指出:

這是由JSONObject.put(字符串,對象)使用。

因此假設JSON對象的鍵是Strings是正確的。

MyClass類型不能upcasted到String直接(String不是MyClass超類),這就是爲什麼在構造函數實際上是抱怨的地圖,因爲它需要地圖的形式HashMap<String,Object>的(請注意,有沒有問題與FloatObject)。

要解決這個問題,你必須定義一個HashMap<String,Float>,你應該存儲你MyClass對象的String表示無論是使用toString

如果您不能使用String您可以考慮使用映射與String一定MyClass對象表示一個代碼的中間結構,所以你可以保留你MyClass類。

+0

如何讓MyClass從字符串中繼承呢?這會是一件可怕的事情嗎?我想不出任何副作用:) – gozzilli 2013-02-19 17:51:37

+0

我會避免擴展這樣的類。這是一個「快速和骯髒」的修復,但打破了繼承的一般概念......這就像說:「嘿,我的人是一個字!」 :)。我會爲MyClass元素定義一個ID(例如代碼,生成的String或數字),並使用映射爲特定的JSON密鑰標識實際的MyClass元素。 – Gamb 2013-02-19 17:54:50

+0

好的非常感謝。 – gozzilli 2013-02-19 17:57:33

0

甘布和阿布的答案都是正確的,並幫助我獲得最終結果。

我解決我的問題是這樣的:

HashMap<MyClass,Float> obj = functionThatReturnsThisStructure(); 

JSONObject jsonObj = new JSONObject(); 

for (Entry<MyClass,Float> entry: obj.entrySet()) { 
    jsonObj.put(entry.getKey().toString(), entry.getValue()); 
} 
相關問題