从JSONObject的HashMap中 - 转换成字符串失败(JSONObject from Ha

2019-10-29 15:47发布

我需要创建一个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 ? 谢谢。

Answer 1:

你需要改变这样的:

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);


Answer 2:

好像你正在使用的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> (请注意,有没有问题的FloatObject )。

要解决此问题,你必须定义一个HashMap<String,Float>你应该存储String表示您MyClass使用对象无论是toString

如果你不能用一个String ,你可以考虑使用映射与表示的代码的中间结构String到一定MyClass对象,所以你可以保留你的MyClass类。



Answer 3:

无论Gamb的和阿布的回答是正确的,帮我去我的最终结果。

我解决了这样我的问题:

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

JSONObject jsonObj = new JSONObject();

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


文章来源: JSONObject from HashMap - Cast to String failed