含反斜杠的JSON字符串解析失败,寻求有效解决方案
解决方法
1. 修复数据库原始数据
你存储的字符串本身不是合法JSON:"C:\"里的反斜杠未转义,会破坏JSON结构。需将数据库中所有路径里的单个反斜杠\替换为双反斜杠\\,确保存储的是标准JSON:
[{"MountPoint":"C:\\","FreeSpace":"18 GB","TotalCapacity":"39 GB","TotalBytes":42580570112,"FreeBytes":19708321792}]
2. 无法修改数据库时,Java层修复
从数据库读取字符串后,先修复转义问题再序列化:
// 读取数据库原始字符串 String dbRawStr = "[{\"MountPoint\":\"C:\\\",\"FreeSpace\":\"18 GB\",\"TotalCapacity\":\"39 GB\",\"TotalBytes\":42580570112,\"FreeBytes\":19708321792}]"; // 替换未转义的单个反斜杠为双反斜杠,避免重复转义 String fixedJson = dbRawStr.replaceAll("(?<!\\\\)\\\\(?!\\\\)", "\\\\\\\\"); // 解析为JSONArray(原始数据是数组,不能用JSONObject) JSONArray jsonArray = new JSONArray(fixedJson); // 序列化后发送给客户端 String responseJson = jsonArray.toString();
3. 规避重复序列化错误
不要直接把数据库读取的字符串存入JSONObject——原始数据是数组结构,应该用JSONArray解析,否则会把整个数组当成单个字符串值传输,导致前端解析时出现多余引号和转义。
错误根源
数据库里的字符串不符合JSON规范:"C:\"中的反斜杠会转义后续的双引号,导致JSON结构断裂。Java序列化时又对反斜杠做了一次转义,最终前端拿到的MountPoint值是"C:\\"(对应实际字符C:\),这个反斜杠再次转义了属性值末尾的双引号,让JSON解析器误以为属性值未结束,从而抛出语法错误。
内容的提问来源于stack exchange,提问作者Liran_T
相关产品推荐
相关产品推荐

