Swift JSONDecoder解码大体积JSON报3840无效JSON错误排查
问题结论
不存在JSONDecoder解码体积阈值一说,你遇到的NSCocoaErrorDomain Code=3840错误和数据大小完全无关。15KB属于极轻量的JSON载荷,系统原生JSON解析器处理上百MB的合法JSON都不会出现体积相关的报错,这个错误的唯一含义是:你传入解码方法的data0字节序列不符合合法JSON规范。
你认为两份JSON格式完全一致,是因为没有做字节级的校验,肉眼比对字符串很容易遗漏不可见的非法字符或细微语法错误。
排查步骤与解决方案
- 第一步:校验data0的UTF8编码合法性
不要直接看Xcode变量区的debug预览,用下面的代码把data0转成原始字符串输出:
如果能正常输出字符串,重点检查首尾有没有多余内容:比如接口返回的BOM头、空字节、HTML错误页片段、非JSON格式的提示文案,这些内容肉眼扫日志很容易漏看。guard let rawJson = String(data: JsonData.data0, encoding: .utf8) else { print("data0不是合法UTF8编码,这是报错的直接原因,通常是数据传输/存储时出现了字节损坏") return } print(rawJson) - 第二步:定位JSON语法错误
把打印出的原始JSON字符串复制到本地语法校验工具检查,这类问题最常见的诱因包括:- 数组/对象最后一个元素后多了多余的尾逗号
- 字符串值里的双引号、反斜杠没有做转义处理
- 布尔值、空值写法不符合JSON规范(比如用大写的
True/False/NULL代替标准的true/false/null) - 混入了0x00-0x1F范围内未转义的不可见控制字符
- 第三步:检查解码前的Data处理逻辑
确认代码里有没有在调用decode前对data0做过额外操作:比如转字符串后重新用非UTF8编码生成Data、做过字符串替换/拼接操作破坏了JSON结构、读写文件/网络返回时用了错误的配置导致字节被修改。
快速定位错误位置
可以先用JSONSerialization做预校验,它抛出的错误会明确标记非法字符的位置,比JSONDecoder的报错信息更精准:
do { _ = try JSONSerialization.jsonObject(with: JsonData.data0, options: .fragmentsAllowed) } catch { print("解析错误详情:\(error)") }
内容的提问来源于stack exchange,提问作者daichi
相关产品推荐
相关产品推荐

