从SQLite获取JSON数据时数组出现转义字符\的解决咨询
解决SQLite取出JSON数组时的转义字符问题
这种转义字符\"出现的情况,我之前在处理JS-Java-SQLite的数据流转时也碰到过,大概率是JSON字符串被重复序列化导致的,下面给你拆解原因和解决办法:
为什么会出现转义字符?
最常见的场景是:
- JavaScript里已经用
JSON.stringify(yourArray)把数组转成了合法的JSON字符串(比如"[1,2,3]"),传到Java层后,又多做了一次序列化操作——比如调用new JSONObject(jsonStr).toString(),这时候原本的双引号会被再次转义,变成"[\"1\",\"2\",\"3\"]",存到数据库里就会保留这些多余的转义符。 - 少数情况是存数据库时用了字符串拼接SQL(而非参数化查询),手动加了转义,但这种现在已经很少见了。
解决办法
1. 从根源修复(最优解):修正存入逻辑
这能彻底避免后续问题,步骤如下:
- 确认JS传递给Java的是已经正确序列化的JSON字符串:比如在JS里执行
JSON.stringify(yourArray),直接把结果传给Java。 - Java层不要对这个字符串再做序列化,直接存入数据库:
这样存进去的就是原始JSON,取出时不会有多余转义。// 假设从JS拿到的正确JSON字符串是jsonArrayStr ContentValues values = new ContentValues(); values.put("json_column", jsonArrayStr); // 用参数化方式插入,避免手动转义 db.insert("your_table", null, values);
2. 取出时临时补救(适合没法改存入代码的场景)
如果暂时没法调整存入逻辑,可以在取出后处理转义:
- 稳妥的方式是用JSON库解析,避免手动替换误改合法转义:
用Gson的话会更简洁:// 从数据库取出带转义的字符串 String escapedJson = cursor.getString(cursor.getColumnIndex("json_column")); // 先解析成原始JSON字符串(此时escapedJson是被转义的字符串,比如 "\"[1,2,3]\"") String rawJson = new JSONObject(escapedJson).getString(""); // 再转成JSON数组 JSONArray jsonArray = new JSONArray(rawJson);Gson gson = new Gson(); String escapedJson = cursor.getString(...); // 还原出原始JSON字符串 String rawJson = gson.fromJson(escapedJson, String.class); // 转成目标数组(YourModel是你的数据模型类) YourModel[] array = gson.fromJson(rawJson, YourModel[].class);
排查是否是存入代码导致的?
- 在存入数据库前,先打印要存入的JSON字符串,如果此时已经有
\",那就是JS到Java的传递或Java层处理出了问题; - 直接查看数据库内容(比如用SQLiteStudio打开.db文件),如果字段值本身带转义,那肯定是存入时就已经生成了转义字符。
内容的提问来源于stack exchange,提问作者user1846348
相关产品推荐
相关产品推荐

