2013-02-19 70 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()); 
} 
相关问题