抱歉重复这个问题,但我的问题是其他问题。 我有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")
是一个字符串。
那么,如何使用我的userdata获取此LinkedHashMap?对不起我的英语不好。谢谢。
答案 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
的调用被视为有效,因为已编译的代码不会检查泛型。但是它会导致从Map
到Map<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
}