json用fastjson转map后去get报错

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> 对象,最后对请求参数进行处理。

但是,在过程中却没有符合上述的预期而是,fastjsonjsonMap<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 获取转换后的整数值。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值