【问题标题】:JSONObject from HashMap - Cast to String failed来自 HashMap 的 JSONObject - 转换为字符串失败
【发布时间】:2013-02-19 17:31:01
【问题描述】:

我需要从自定义类的toStringHashMap 和一个浮点值创建一个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 的最佳方法是什么?谢谢。

【问题讨论】:

  • 你使用哪个 JSON 库?

标签: java json casting hashmap


【解决方案1】:

你需要改变这个:

HashMap&lt;MyClass,Float&gt; map = new HashMap&lt;MyClass,Float&gt;();

HashMap&lt;String,Float&gt; map = new HashMap&lt;String,Float&gt;();

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

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

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

MyClass m = new MyClass();
map.put(m.toString,123.45f);

【讨论】:

  • 好吧,我无法将 HashMap 更改为 &lt;String,Float&gt;,因为我正在使用该类做其他事情。也许我可以创建一个中间 HashMap,在其中复制原始值的值。那时我可能应该创建一个 JSONObject 并将值直接放入其中。
  • 所以您可以直接将该对象放入地图中:map.put(m,123.45f);
【解决方案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 键的keyPool 映射的外观来看,该映射似乎处理具有String 键和Object 值的条目。在 cmets 中,它还声明:

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

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

您的MyClass 类型不能直接向上转换为StringString 不是MyClass 的超类),这就是构造函数实际上抱怨映射的原因,因为它需要一个形成HashMap&lt;String,Object&gt;(注意FloatObject没有问题)。

要解决此问题,您必须定义一个 HashMap&lt;String,Float&gt;,您应该使用 MyClass 对象存储 String 表示形式,或者使用 toString

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

【讨论】:

  • 那么让 MyClass 从 String 扩展怎么样?那会是一件可怕的事情吗?我想不出任何副作用:)
  • 我会避免扩展这样的类。这是一个“快速而肮脏”的解决方案,但打破了继承的一般概念......就像说“嘿,我的人是一个词!” :)。我会为 MyClass 元素定义一个 ID(例如代码、生成的字符串或数字),并使用映射来识别特定 JSON 键的实际 MyClass 元素。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2017-08-21
    • 2012-07-31
    • 2021-11-15
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多