You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift JSONDecoder解码大体积JSON报3840无效JSON错误排查

问题结论

不存在JSONDecoder解码体积阈值一说,你遇到的NSCocoaErrorDomain Code=3840错误和数据大小完全无关。15KB属于极轻量的JSON载荷,系统原生JSON解析器处理上百MB的合法JSON都不会出现体积相关的报错,这个错误的唯一含义是:你传入解码方法的data0字节序列不符合合法JSON规范。
你认为两份JSON格式完全一致,是因为没有做字节级的校验,肉眼比对字符串很容易遗漏不可见的非法字符或细微语法错误。

排查步骤与解决方案
  • 第一步:校验data0的UTF8编码合法性
    不要直接看Xcode变量区的debug预览,用下面的代码把data0转成原始字符串输出:
    guard let rawJson = String(data: JsonData.data0, encoding: .utf8) else {
        print("data0不是合法UTF8编码,这是报错的直接原因,通常是数据传输/存储时出现了字节损坏")
        return
    }
    print(rawJson)
    
    如果能正常输出字符串,重点检查首尾有没有多余内容:比如接口返回的BOM头、空字节、HTML错误页片段、非JSON格式的提示文案,这些内容肉眼扫日志很容易漏看。
  • 第二步:定位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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 18:33:26