Swift 4.1(Xcode9.2)JSONDecoder解析531字节数据遇损坏错误求助
咱先来拆解你遇到的问题:在Swift 4.1和Xcode 9.2环境下,用JSONDecoder解析服务器返回的531字节数据时触发了dataCorrupted错误,核心提示是给定的数据不是有效的JSON,底层错误明确指向:JSON text did not start with array or object and option to allow fragments not set。
先把你碰到的完整错误信息贴出来方便对照:
dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo={NSDebugDescription=JSON text did not start wi...)))
接下来给你几个排查和解决的方向:
1. 先确认服务器返回的原始内容到底是什么
这是最关键的一步!很多时候这种错误不是解析代码的问题,而是服务器返回的根本不是标准JSON。你可以把接收到的Data转成字符串打印出来看看:
if let responseString = String(data: yourReceivedData, encoding: .utf8) { print("服务器返回内容:\(responseString)") }
531字节的内容大概率不是单个JSON片段,更可能是服务器返回了错误页面(比如404/500的HTML源码)、带了多余的空白字符、BOM头,甚至是你请求的接口本身就返回非JSON格式的内容。
2. 针对“allow fragments not set”的临时解决(仅适用于特殊场景)
如果确认服务器确实返回的是单个JSON片段(比如纯字符串、数字,不是{}或[]包裹的合法JSON对象/数组),那你可以给JSONDecoder开启允许片段的选项:
let decoder = JSONDecoder() decoder.allowsFragments = true // 再执行解析逻辑 do { let result = try decoder.decode(YourModel.self, from: yourReceivedData) // 处理解析结果 } catch { print("解析错误:\(error)") }
不过正规的接口一般不会返回这种片段,所以这个方法更像是临时补丁,优先还是要确认接口返回格式是否符合预期。
3. 其他排查点
- 检查请求的URL、HTTP方法、请求头是否正确,有没有传错参数导致服务器返回错误响应;
- 试试用其他编码格式转字符串,比如
.isoLatin1,避免因为编码问题导致转出来的字符串乱码,看不出真实内容; - 确认是否接收到了完整的响应数据,有没有出现数据截断的情况。
内容的提问来源于stack exchange,提问作者Neck

