13

我正在使用org.eclipse.jetty.util.ajax.JSON来解析 JSON 文本。但是JSON.parse(string)方法会生成一个 Object,我需要它作为 Map。在内部,它正是上述类的对象。但是,如何在不构造新对象或收到未经检查的强制转换警告的情况下将对象转换为地图?

目前,我只找到了一个没有未经检查的强制转换警告的解决方案,而是构建了一个新的 Map,这实际上当然根本不是强制转换。

private Map<String,Object> getMap(String string) {
    HashMap<String,Object> result = new HashMap<>();
    Object object = JSON.parse(string);
    if (object instanceof Map) {
        Map<?,?> map = (Map)(object);
        for (Map.Entry<?,?> entry : map.entrySet()) {
            String key = entry.getKey().toString();
            Object value = entry.getValue();
            result.put(key,value);
        }
    }
    return result;
}

那么是否有办法在没有未经检查的强制转换警告的情况下正确转换它?

4

1 回答 1

13

编译器不能保证强制转换是安全的。由于您是做出保证的人,因此您应该使用@SuppressWarnings("unchecked")

http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/SuppressWarnings.html

正如@TedHopp 指出的那样,应该使用该库的方式是将返回的每个值转换Object为您知道的类型(但您必须转换您检索的每个属性)请参阅此处的映射http:/ /download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/util/ajax/JSON.html

它带来的一点是,您保证此 JSON 对象仅包含其他 JSON 对象(映射到对象)

因此,如果由于某种原因您通过了输入

// properties are not quoted for readability
{ a: 2, b : {c:3} }

当您尝试时,您的代码会因无效的强制转换异常而失败

map.get("a")

所以请记住,您是保证您解析为 JSON 的字符串中的内容的人

如果你不能保证,你就不能创建你想要的这个getMap函数。您必须@SupressWarnings在知道特定对象是什么类型的地方进行强制转换(和)。

对于使用 JSON 时的某些类型安全性,您应该了解

这些类允许您将 JSON 直接读入 Java 类

于 2012-10-17T05:07:28.883 回答