0

我需要JSONObjectHashMap自定义类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?谢谢。

4

3 回答 3

2

你需要改变这个:

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

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

正如您所说的“自定义类的 toString 和浮点值的 HashMap

您还没有提到如何将值放入哈希图中。

但是如果你使用toString自定义类的方法,那么你应该把它写成:

MyClass m = new MyClass();
map.put(m.toString,123.45f);
于 2013-02-19T17:34:11.467 回答
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键和值的条目。在评论中,它还指出:ObjectkeyPoolString

这由 JSONObject.put(string, object) 使用。

所以假设 JSON 对象的键是Strings.

您的MyClass类型不能String直接向上转换(String不是 的超类MyClass),这就是构造函数实际上抱怨映射的原因,因为它需要表单的映射(注意andHashMap<String,Object>没有问题)。FloatObject

要解决此问题,您必须定义一个HashMap<String,Float>应该存储对象String表示的位置,MyClass方法是使用toString.

如果您不能使用 a String,您可以考虑使用中间结构,将用 a 表示的代码映射String到某个MyClass对象,这样您就可以保留您的MyClass类。

于 2013-02-19T17:48:26.977 回答
0

Gamb 和 Abu 的答案都是正确的,并帮助我获得了最终结果。

我这样解决了我的问题:

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

JSONObject jsonObj = new JSONObject();

for (Entry<MyClass,Float> entry: obj.entrySet()) {
    jsonObj.put(entry.getKey().toString(), entry.getValue());
}
于 2013-02-19T18:03:12.287 回答