我正在使用 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;
}
那么是否有一种方法可以在没有未经检查的投射警告的情况下正确施放它?
答案 0 :(得分:11)
编译器无法保证强制转换是安全的。由于您是提出保证的人,因此您应该使用@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类