json用fastjson转map后去get报错
fastjson
使用Map<String,String> map = (Map<String,String>) JSON.parse(s);
后去map.get()
报错java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
fastjson转map,java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
,map的get报错,SpringWeb开发,踩坑,类型转换。
在 Web 开发中,使用 fastjson 将 JSON 数据转换为
Map<String, String>
对象的场景很多,在接收 HTTP 请求时,常常需要将请求参数转换为Map<String, String>
对象进行处理。例如:
@RequestMapping(value = "/user", method = RequestMethod.POST)
@ResponseBody
public String addUser(@RequestBody String s) {
Map<String, String> map = (Map<String,String>) JSON.parse(s);
int age = Integer.parseInt(map.get("age"));
// 处理请求参数
return "success";
}
在这个示例代码中,使用 @RequestBody
注解将请求体中的 JSON 数据转换为 String 类型的参数 jsonStr
,然后将 jsonStr
转换为 Map<String, String>
对象,最后对请求参数进行处理。
但是,在过程中却没有符合上述的预期而是,fastjson
把json
转Map<String,String>
后去get
报错java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
解决方案
经过探究,如果在使用 fastjson 将 JSON 字符串转换为 Map<String, String>
对象后,使用 get()
方法获取值时出现了 java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
异常,可能是因为在 JSON 字符串中的值类型不是 String
类型,而是其他类型,例如整数类型。
要解决这个问题,可以使用以下代码将 JSON 字符串转换为 Map<String, Object>
对象,然后根据实际情况将值转换为需要的类型:
@RequestMapping(value = "/user", method = RequestMethod.POST)
@ResponseBody
public String addUser(@RequestBody String s) {
Map<String, Object> map = JSON.parseObject(jsonString, new TypeReference<Map<String, Object>>(){});
int age = (int) map.get("age");
// 处理请求参数
return "success";
}
错误原理
在使用 JSON.parse()
方法将 JSON 字符串转换为 Map<String, String>
对象时,fastjson 会将 JSON 中的所有值都转换为字符串类型,即使原始值是整数类型或其他类型。因此,在使用 get()
方法获取值时,需要将值转换为需要的类型。
例如,对于以下 JSON 字符串:
{
"stock": 100
}
如果使用以下代码将 JSON 字符串转换为 Map<String, String>
对象:
String jsonString = "{ \"stock\": 100 }";
Map<String, String> map = (Map<String, String>) JSON.parse(jsonString);
则会抛出 java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
异常,因为在 Map<String, String>
对象中存储的值类型是字符串类型,而不是整数类型。
可以使用以下代码将 JSON 字符串转换为 Map<String, Object>
对象,然后根据实际情况将值转换为需要的类型:
String jsonString = "{ \"stock\": 100 }";
Map<String, Object> map = JSON.parseObject(jsonString, new TypeReference<Map<String, Object>>(){});
int stock = (int) map.get("stock");
这个代码将 JSON 字符串转换为 Map<String, Object>
对象,并将值 100
转换为整数类型。在这个示例代码中,可以使用 (int) map.get("stock")
获取键为 "stock"
的整数值。
如果你一定要将值类型转换为 String
类型,可以使用以下代码将值类型转换为字符串类型:
String stockStr = map.get("stock");
int stock = Integer.parseInt(stockStr);
这个代码将键为 "stock"
的值类型转换为字符串类型,并将其转换为整数类型。在这个示例代码中,可以使用 stock
获取转换后的整数值。