使用SwiftyJSON解析合法JSON时获取records字段返回null的问题
SwiftyJSON 解析JSON字符串返回null的解决方案
核心问题根源
SwiftyJSON的JSON初始化方法不会隐式处理JSON字符串的解析逻辑。你直接传入字符串给JSON(string)时,框架只会把这段字符串作为普通文本值存储,根本不会执行“字符串转Data、JSON序列化、结构拆解”的完整解析流程。
这种情况下整个JSON的层级结构完全没有被识别,哪怕原字符串格式完全合法,你通过键值路径取records字段时也只会拿到null。
正确修复步骤
- 第一步:将合法的JSON字符串转换为UTF-8编码的Data二进制数据
- 第二步:使用转换得到的Data实例初始化SwiftyJSON的
JSON对象,框架会自动完成JSON结构的解析 - 第三步:即可正常通过键路径提取
records等字段的值
修复后的参考代码
let jsonString = """ {"ResponseMetadata": {"RequestId": "b5d6ecad-e050-4d1f-8429-74a2775a6fe9", "HTTPStatusCode": 200, "HTTPHeaders": {"x-amzn-requestid": "b5d6ecad-e050-4d1f-8429-74a2775a6fe9", "content-type": "application/json", "content-length": "271", "date": "Tue, 22 Dec 2020 22:45:17 GMT"}, "RetryAttempts": 0}, "numberOfRecordsUpdated": 0, "records": [[{"stringValue": "6998DFFE-A9CF-4BEA-86AD-C356BB865E27"}, {"stringValue": "david.craine@yahoo.com"}, {"stringValue": "David"}, {"stringValue": "Craine"}, {"stringValue": "dcraine"}, {"stringValue": "vendor1"}, {"stringValue": "vendor1_werw8"}]]} """ // 字符串转Data guard let jsonData = jsonString.data(using: .utf8) else { return } // 用Data初始化完成JSON解析 let body = JSON(jsonData) // 正常提取字段 print(">>>>>>>>>> \(body["records"])")
快速排查方法
如果仍存在取值异常,可以打印body.type确认解析状态:
- 解析逻辑错误时,会输出
string类型,说明框架并未识别到JSON结构 - 解析正常时,会输出
dictionary类型,代表整个JSON已经被成功拆解为可访问的键值对结构。
内容的提问来源于stack exchange,提问作者Asteroid
相关产品推荐
相关产品推荐

