fastjson中出现 com.alibaba.fastjson.JSONException:(syntax error, expect {, actual string, pos 0)

修复JSON数据格式问题
本文介绍了一种常见的JSON数据格式错误——多余的转义字符,并提供了详细的解决方案。首先使用Alibaba的fastjson库中的JSON.parse方法格式化数据,移除多余的转义字符;然后通过JSON.parseObject方法将字符串转换为具体的Bean对象,实现数据的正确解析。
一:原因分析

原数据格式问题: 多了个 ”\“

"{\"obj_id\": \"shzc_test_01\", \"img_url\": \"http://aa.bb.com/businessImages/imageFile/a7rMTLYrqIg/shzc_test_01/2020-05-11/shzc_test_01_1589190347333.jpg\"}"
二:问题解决

1.先用alibaba的fastjson的 JSON.parse(msg) 进行格式化
格式化会自动去除 “\”

{"img_url": "http://aa.bb.com/businessImages/imageFile/a7rMTLYrqIg/shzc_test_01/2020-05-11/shzc_test_01_1589195337809.jpg", "obj_id": "shzc_test_01", "upload_time": "2020-05-11 19:00:01"}

2.再使用 JSON.parseObject(msg,Entity.class) 进行转换,将string转为bean对象

### 错误分析 `com.alibaba.fastjson.JSONException: syntax error, expect {, actual string` 这个异常通常发生在使用 `fastjson` 解析 JSON 字符串时,期望解析到 `{`(表示一个 JSON 对象的开始),但实际上读取到了字符串。这通常意味着输入的 JSON 格式不正确。 #### 常见原因 1. **JSON 格式错误**:输入的字符串不是有效的 JSON 格式,例如缺少大括号、引号未闭合等。 2. **字符串中包含额外的引号或转义字符**:前端使用 `JSON.stringify()` 多次导致 JSON 字符串被重复序列化,增加了多余的引号和反斜杠。 3. **空对象或无效内容**:解析的 JSON 字符串为空或者包含无法解析的内容。 ### 解决方案 #### 1. 检查 JSON 格式 确保输入的 JSON 字符串是有效的。可以通过在线工具验证 JSON 格式,或者在代码中添加日志输出,打印传入的 JSON 字符串以进行检查。 ```java String jsonString = "{\"key\":\"value\"}"; // 确保格式正确 ``` #### 2. 避免多次序列化 在前端,避免对已经序列化的字符串再次调用 `JSON.stringify()`。确保只调用一次,避免多余的引号和转义字符。 ```javascript let data = { key: "value" }; let jsonString = JSON.stringify(data); // 正确使用 ``` #### 3. 清理输入字符串 在解析之前,可以尝试清理输入字符串,去除多余的引号或转义字符。 ```java String cleanedJson = jsonString.trim().replaceAll("^\"|\"$", "").replaceAll("\\\\\"", "\""); ``` #### 4. 使用适当的解析方法 根据输入的 JSON 类型选择合适的解析方法。如果输入的是数组,使用 `parseArray`;如果是对象,使用 `parseObject`。 ```java // 解析 JSON 对象 JSONObject jsonObject = JSON.parseObject(cleanedJson); // 解析 JSON 数组 JSONArray jsonArray = JSON.parseArray(cleanedJson); ``` #### 5. 处理空对象 在解析之前检查字符串是否为空或无效内容,避免解析失败。 ```java if (StringUtils.isNotEmpty(cleanedJson)) { // 进行解析操作 } ``` ### 示例代码 以下是一个完整的示例,展示如何处理可能存在问题的 JSON 字符串并进行解析: ```java import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONArray; import org.apache.commons.lang3.StringUtils; public class JsonParserExample { public static void main(String[] args) { String jsonString = "{\"key\":\"value\"}"; // 示例 JSON 字符串 // 清理输入字符串 String cleanedJson = jsonString.trim().replaceAll("^\"|\"$", "").replaceAll("\\\\\"", "\""); if (StringUtils.isNotEmpty(cleanedJson)) { try { // 判断是对象还是数组 if (cleanedJson.startsWith("{")) { JSONObject jsonObject = JSON.parseObject(cleanedJson); System.out.println("Parsed JSON Object: " + jsonObject); } else if (cleanedJson.startsWith("[")) { JSONArray jsonArray = JSON.parseArray(cleanedJson); System.out.println("Parsed JSON Array: " + jsonArray); } } catch (Exception e) { e.printStackTrace(); } } else { System.out.println("Input JSON string is empty or invalid."); } } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值