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

2022-09-04 03:25:30

我正在使用 org.eclipse.jetty.util.ajax.JSON 来解析 JSON 文本。但是JSON.parse(string)方法生成一个对象,我需要它作为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

编译器不能保证强制转换是安全的。由于您是提供担保的人,因此您应该使用@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.htmlObject

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

因此,如果由于某种原因,您被传递了输入

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

当您尝试时,您的代码将失败并显示无效的强制转换异常

map.get("a")

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

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

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

这些类允许您将JSON直接读取到Java类中


答案 2