我需要创建一个JSONObject
从一个HashMap
的自定义类的的toString
和一个浮点值。 我想下面希望它只是工作的代码:
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
? 谢谢。
你需要改变这样的:
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);
好像你正在使用的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
键和Object
由外观值keyPool
他们用来管理独特的地图String
键。 在评论,其还指出:
这是通过JSONObject.put(字符串,对象)使用。
因此,这将是正确的假设JSON对象的键是Strings
。
您MyClass
类型不能upcasted到String
直接( String
不是一个超类MyClass
),这就是为什么在构造函数实际上是抱怨的地图,因为它需要地图形式HashMap<String,Object>
(请注意,有没有问题的Float
和Object
)。
要解决此问题,你必须定义一个HashMap<String,Float>
你应该存储String
表示您MyClass
使用对象无论是toString
。
如果你不能用一个String
,你可以考虑使用映射与表示的代码的中间结构String
到一定MyClass
对象,所以你可以保留你的MyClass
类。
无论Gamb的和阿布的回答是正确的,帮我去我的最终结果。
我解决了这样我的问题:
HashMap<MyClass,Float> obj = functionThatReturnsThisStructure();
JSONObject jsonObj = new JSONObject();
for (Entry<MyClass,Float> entry: obj.entrySet()) {
jsonObj.put(entry.getKey().toString(), entry.getValue());
}