2012-10-17 58 views
9

我正在使用org.eclipse.jetty.util.ajax.JSON来解析JSON文本。 但是JSON.parse(字符串)方法产生一个对象,我需要它作为一个地图。 在内部,它正是所提到的类的一个对象。 但是,如何将一个对象转换为一个Map,而无需构建一个新对象或获取未经检查的强制转换警告?将Java对象转换为Java地图<String,Object>

目前,我发现只有一个解决方案没有未经检查的转换警告,但与构建一个新的地图,这实际上当然不是一个铸造。

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

类型检查在类型铸造之前可能摆脱警告。 –

+1

@JanDvorak之前的类型检查没有帮助 – Bohemian

+0

@JanDvorak - 由于类型删除,您不能键入检查特定类型的通用映射。 (例如,使用类型检查,你不能区分'Map 'Map ')。 –

回答

11

编译器不能保证转换是安全的。既然你是一个做担保,你应该使用@SuppressWarnings("unchecked")

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

由于@TedHopp指出,该库是应该使用的方式是,你在returnd 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类

+1

另请参见[this thread](http://stackoverflow.com/questions/1774356/casting-from-object-in-java-without-getting-an-unchecked - 警告),基本上是相同的答案。您可以使用非泛型“Map”并从任何“get”调用中转换返回值,而不是抑制警告。 –

+0

但实际上可能有些情况下,我无法保证未经检查的演员。只有在输入字符串在{{}内时,该投射才有效,而在其他情况下,它可能不是Map。 – KoichiSenada

+0

@KoichiSenada如果你可以保证输入格式为{{a:{...},b:{...}}',那么你只能使用你的'getMap'函数,那就是属性顶层是JSON对象 –

相关问题