Java中用Couchbase SDK解析转义JSON报IllegalStateException怎么解决
问题原因
上游返回的JSON格式不符合标准JSON规范,存在两处错误:
- 外层多包裹了一对冗余双引号,导致解析器识别到根节点为字符串而非JSON对象,和你收到的报错信息
java.lang.IllegalStateException: Expecting Object as root level object, was: VALUE_STRING完全匹配 - 内部所有双引号被错误转义为连续两个双引号,属于非标准的转义格式,常见于CSV导出JSON、旧版Windows平台序列化JSON的场景
解决方案
在调用Couchbase解析方法前,先对原始字符串做预处理,处理完成后再传入解析即可,代码示例如下:
import com.couchbase.client.java.document.json.JsonObject; import com.couchbase.client.java.transcoder.JsonTranscoder; // 你的原始上游字符串 String rawInput = "\"{\"\"event\"\":{\"\"signup\"\":false,\"\"zip\"\":\"\"1985\"\",\"\"type\"\":\"\"DIY\"\",\"\"registration\"\":false,\"\"file\"\":{\"\"filePath\"\":[\"\"9a16-832c6e90dc47/5fa0ee/163221822779.png\"\"]},\"\"details\"\":{\"\"dream\"\":\"\"test\"\"}},\"\"slot\"\":{\"\"loc\"\":{\"\"type\"\":\"\"NO\"\"},\"\"rest\"\":\"\"No\"\"}}\""; // 第一步:去除首尾冗余的双引号,注意要先trim掉可能存在的首尾空白 String processed = rawInput.trim(); if (processed.startsWith("\"") && processed.endsWith("\"")) { processed = processed.substring(1, processed.length() - 1); } // 第二步:将所有连续两个双引号替换为单个双引号 processed = processed.replace("\"\"", "\""); // 再调用Couchbase的解析方法即可 JsonTranscoder trans = new JsonTranscoder(); JsonObject jsonObj = trans.stringToJsonObject(processed);
验证说明
处理后的字符串完全符合标准JSON格式,可直接通过任意JSON解析器正常解析,不需要修改上游服务逻辑,在本地做预处理即可兼容。
内容的提问来源于stack exchange,提问作者Vishnu
相关产品推荐
相关产品推荐

