将Java对象转换为Java Map<String,Object>

14
我正在使用org.eclipse.jetty.util.ajax.JSON解析JSON文本。 但是JSON.parse(string)方法生成的是一个对象,而我需要将其作为Map使用。 在内部,它实际上就是所提到类的一个对象。 但是如何将一个对象强制转换为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;
}

有没有一种正确的方式可以进行类型转换,而不会出现未经检查的类型转换警告?


1
在类型转换之前进行类型检查可能会消除警告。 - John Dvorak
1
@JanDvorak 在之前进行类型检查是没有帮助的。 - Bohemian
@JanDvorak - 由于类型擦除,您无法对特定类型的泛型映射进行类型检查。(例如,您无法使用类型检查区分 Map<String,Object>Map<Integer,Object>。) - Ted Hopp
我已经尝试过(object instanceof Map<String,Object>),但它不起作用,而(object instanceof Map)则可以。 - KoichiSenada
@KoichiSenada 唯一安全的转换是向下转换,例如从 String 转换为 Object,但不是从 Object 转换为 String。因为每个字符串都是一个对象,但并非每个对象都是一个字符串。 - Ruan Mendes
显示剩余5条评论
1个回答

13
编译器无法保证强制转换的安全性。既然你是提供保证的人,应该使用@SuppressWarnings("unchecked")

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

作为@TedHopp所指出的,该库的使用方式是,您将返回的每个值都强制转换为您知道的类型(但您必须强制转换检索到的每个属性)。在此处查看映射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函数。您必须在知道特定对象类型的位置进行转换(和@SuppressWarnings)。

为了在处理JSON时获得一些类型安全性,您应该学习有关的知识。

这些类允许你直接将JSON读入到Java类中


1
还可以参考这个帖子,本质上是相同的答案。不必压制警告,您可以使用非泛型的Map并将任何get调用的返回值转换。 - Ted Hopp
@TedHopp 当你从映射中取出数据时,仍然需要进行类型转换。 - Ruan Mendes
@JuanMendes,我知道使用Jetty JSON并不是一项简单的任务。 - KoichiSenada
Map<?,?> map = (Map)(object); 运行良好,但无法提供键和值的类型。 - KoichiSenada
@TeddHopp 我认为你会收到警告,因为你需要一个 MapString 或其他某些东西,但类型被声明为 Object - Ruan Mendes
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接