Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java对象强制转换为Java映射<;字符串,对象>;_Java_Json_Map_Casting_Jetty - Fatal编程技术网

将Java对象强制转换为Java映射<;字符串,对象>;

将Java对象强制转换为Java映射<;字符串,对象>;,java,json,map,casting,jetty,Java,Json,Map,Casting,Jetty,我正在使用org.eclipse.jetty.util.ajax.JSON来解析JSON文本。 但是JSON.parse(string)方法生成一个对象,我需要它作为映射。 在内部,它正是所提到的类的对象。 但是,如何在不构建新对象或未检查强制转换警告的情况下将对象强制转换到地图中 目前,我只找到了一个没有未检查强制转换警告的解决方案,但是构建了一个新的地图,这当然不是一个强制转换 private Map<String,Object> getMap(String string) {

我正在使用org.eclipse.jetty.util.ajax.JSON来解析JSON文本。 但是JSON.parse(string)方法生成一个对象,我需要它作为映射。 在内部,它正是所提到的类的对象。 但是,如何在不构建新对象或未检查强制转换警告的情况下将对象强制转换到地图中

目前,我只找到了一个没有未检查强制转换警告的解决方案,但是构建了一个新的地图,这当然不是一个强制转换

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;
}
私有映射getMap(字符串){
HashMap结果=新建HashMap();
Object=JSON.parse(字符串);
if(映射的对象实例){
Map=(Map)(对象);
对于(Map.Entry:Map.entrySet()){
String key=entry.getKey().toString();
对象值=entry.getValue();
结果。输入(键、值);
}
}
返回结果;
}

那么,是否有一种方法可以在没有未检查强制转换警告的情况下正确地强制转换它?

编译器无法保证强制转换是安全的。因为你是担保人,所以你应该使用
@SuppressWarnings(“unchecked”)

正如@TedHopp所指出的,库的使用方式应该是将returnd
对象中的每个值强制转换为您知道的类型(但必须强制转换您检索到的每个属性)。请参见此处的映射

它指出的一点是,您保证这个JSON对象只包含其他JSON对象(映射到对象)

因此,如果出于某种原因,您通过了输入

// properties are not quoted for readability
{ a: 2, b : {c:3} }
当您尝试时,您的代码将因无效的强制转换异常而失败

map.get("a")
所以请记住,您是保证要解析为JSON的字符串中所包含内容的人

如果不能保证,则无法创建所需的getMap函数。您必须在知道特定对象是什么类型的位置进行铸造(和
@superswarnings

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


这些类允许您将JSON直接读入Java类

类型转换之前的类型检查可能会消除警告。@JanDvorak类型检查之前不会help@JanDvorak-由于类型擦除,无法对特定类型的泛型映射进行类型检查。(例如,使用类型检查无法区分
Map
Map
)我尝试了
(Map的对象实例)
,但它不起作用,而
(Map的对象实例)
起作用。@TedHopp您至少可以检查它是一个映射。您仍然会有一个
原始类型
警告。另外,请参阅本质上相同的答案。您可以使用非泛型的
Map
从任何
get
调用中强制转换返回值,而不是抑制警告。但实际上,在某些情况下,我无法保证未选中强制转换。只有当输入字符串在
{}
范围内时,强制转换才起作用,而在其他情况下,它可能不是映射。@KoichiSenada您只能使用your
getMap
函数,前提是您能保证输入的格式为
{a:{…},b:{…}
,仅此而已,顶层的属性是JSONobjects@TedHopp,你如何在不压制警告的情况下使用非通用地图?@KoichiSenada你问的问题与大家已经告诉你的一样,没有办法。请参阅我的解释和答案中的编辑。