[英]How to convert a JSON string to a Map<String, String> with Jackson JSON
[英]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
的调用被视为有效,因为编译后的代码无需检查泛型。 但这会导致从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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.