如何将JSON字符串转换为Map

时间:2016-11-08 12:49:45

标签: java json parsing hashmap linkedhashmap

抱歉重复这个问题,但我的问题是其他问题。 我有JSON解析器方法,我从json-string解析到map。但是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")不是一个字符串,它是链接的哈希地图。所以,我可以这样做:

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

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

调试器的屏幕截图: enter image description here

那么,如何使用我的userdata获取此LinkedHashMap?对不起我的英语不好。谢谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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
}