如何将 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")) 其中 returns 一个 Map。
Java 对泛型应用类型擦除。它在编译时检查类型正确性,然后在编译代码(字节码)中删除通用签名。因此,在运行时没有检查。
查看此示例,它与您的 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
}
很抱歉重复这个问题,但我的问题是其他的。 我有 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")) 其中 returns 一个 Map。
Java 对泛型应用类型擦除。它在编译时检查类型正确性,然后在编译代码(字节码)中删除通用签名。因此,在运行时没有检查。
查看此示例,它与您的 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
}