我在用org.eclipse.jetty.util.ajax.JSON解析 JSON 文本。
但是JSON.parse(字符串)方法生成一个对象,我需要它作为映射。
在内部,它正是所提到的类的对象。
但是,如何在不构造新对象或收到未经检查的转换警告的情况下将对象转换为映射呢?
目前,我只找到了一种解决方案,没有未经检查的强制转换警告,但构建了一个新的地图,这实际上根本不是强制转换。
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;
}
那么是否有办法在没有未经检查的强制转换警告的情况下正确强制转换呢?
编译器无法保证强制转换是安全的。由于您是做出保证的人,因此您应该使用@SuppressWarnings("unchecked")
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/SuppressWarnings.html 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 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 时的某些类型安全性,您应该了解
- http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/util/ajax/JSON.Convertor.html http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/util/ajax/JSON.Convertor.html
- http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/util/ajax/JSON.Convertible.html http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/util/ajax/JSON.Convertible.html
- http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/util/ajax/JSON.Generator.html http://download.eclipse.org/jetty/stable-7/apidocs/org/eclipse/jetty/util/ajax/JSON.Generator.html
这些类允许您将 JSON 直接读取到 Java 类中
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)