来自HashMap的JSONObject - Cast to String失败

时间:2013-02-19 17:31:02

标签: java json casting hashmap

我需要从自定义类JSONObject的{​​{1}}和浮点值创建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 的最佳方法是什么?感谢。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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键的Object地图的外观处理带有keyPool键和String值的条目。在评论中,它还表示:

  

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

因此,假设JSON对象的键是Strings是正确的。

您的MyClass类型无法直接升级到StringString不是MyClass的超类),这就是构造函数实际上在抱怨地图的原因,因为它需要HashMap<String,Object>形式的地图(请注意,FloatObject没有问题)。

要解决此问题,您必须定义一个HashMap<String,Float>,您应该使用String存储MyClasstoString对象的代表。

如果您无法使用String,可以考虑使用将String代表的代码映射到某个MyClass对象的中间结构,这样您就可以保留{ {1}}上课。

答案 2 :(得分: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());
}