繁体   English   中英

如何将JSON字符串转换为Map

[英]How to convert JSON String to Map

很抱歉重复这个问题,但是我的问题是其他问题。 我有JSON解析器方法,我从json-string解析为映射。 但是json-string的值也就是json-string。 像这样:

    {
   "status_code":"255",
   "data":"{\"user\":{\"idpolzovatel\":1,\"id_poluch_tip\":1,\"fio_polzovatel\":\"Andrew Artificial\",\"login\":\"imi\",\"parol\":\"698d51a19d8a121ce581499d7b701668\",\"key\":null,\"nachalnik\":1,\"buhgalter\":0,\"delopr\":1},\"token\":\"230047517dd122c8f8116a6fa591a704\"}",
   "message":"Successfull!"
}

所以,我的解析方法:

public Map<String, String> convertToMapFromJSON(String res){
    ObjectMapper objectMapper = new ObjectMapper();
    Map<String, String> response = new HashMap<String, String>();
    try {
        response = objectMapper.readValue(res, new TypeReference<Map<String, String>>);
        int t = 0;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return response;
}

我得到客户的回应:

ResponseEntity<String> responseEntity = restTemplate.postForEntity(REST_SERVICE_URI + "/auth/", data, String.class);

得到身体

String res = responseEntity.getBody();//получаем тело запроса в формате JSON

然后使用这些方法:

Map<String, String> response = convertToMapFromJSON(res);

Map<String, String> data1 = convertToMapFromJSON(response.get("data"));

Map<String, String> userDetailes = convertToMapFromJSON(data1.get("user"));

但是,当我使用最后一个方法data1.get("user"); 我得到异常:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to java.lang.String

好的,我知道了。 因此, data1.get("user")不是字符串,而是linkedHashMap。 因此,我可以这样做:

Map<String, String> userDetailes = data1.get("user");

但是然后我得到了错误,IDE在说我,那个data1.get("user")是一个字符串。

调试器的屏幕截图: 在此处输入图片说明

那么,如何获得带有我的用户数据的LinkedHashMap? 对不起我的英语不好。 谢谢。

看起来ObjectMapper已将字符串解码为JSON格式并已为您解析。 您可以只添加一个新方法来解析(data1.get(“ user”)),该方法将返回一个Map。

Java对泛型应用类型擦除。 它在编译时检查类型正确性,然后删除编译代码(ByteCode)中的通用签名。 因此,在运行时没有检查。

请参见此示例,该示例具有与JSON库相同的行为:

/** Returns a generic map which all keys are string but not values **/
T <T extends Map> raw(Class<T> clazz) {
    Map object = new LinkedHashMap();
    object.put("string", "This is a String");
    object.put("map"   , new LinkedHashMap());
    return (T) object;
}

这是您的代码:

/** codes you try to execute/write **/
void withStringValues() {
    Map<String,String> object = raw(Map<String,String>.class);
    String string = object.get("string"); // Ok
    String map    = object.get("map");    // ClassCastException
    Map    map    = object.get("map");    // Doesn't compile
}

如您所见,对raw的调用被视为有效,因为编译后的代码无需检查泛型。 但这会导致从MapMap<String,String>的无效且隐式的强制转换,实际上在编译的代码中不会发生。

泛型被删除,是已编译的版本:

void withTypeErasure() {
    Map object = raw(Map.class);
    String string = (String) object.get("string");
    String map    = (String) object.get("map");
}

如您所见,Java编译器已删除所有泛型并添加了必要的强制转换。 您可以在此处查看出了什么问题。

您的真实代码必须如下所示:

void withRealValues() {
    Map<String,Object> object = raw(Map<String,Object>.class);
    String             string = (String) object.get("string"); // Ok
    Map<String,Object> map    = (Map) object.get("map");       // Ok
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM