JSON二次解析失败导致代码逻辑未执行的问题求助
兄弟,我看完你的代码和控制台输出,立刻找到问题所在了——你对past_predictions的类型判断完全错了,这就是为什么print("****:", pastPredictionsArray)压根没执行的原因!
问题根源分析
先看你控制台里的past_predictions结构:
["past_predictions": <__NSArrayI 0x600002b401c0>(
<__NSArrayI 0x600002519200>(
"Sample_Request_String",
{"Status": "Pass", "Payload": {dictionaries}], "UserId": "YOUR_GOOGLE_MAPS_API_KEY", "Id": "xyz"}},
2023-08-31 12:49:28
)
,
<__NSArrayI 0x6000025181e0>(
"Sample_Request_String",
{"Status": "Pass", "Payload": {dictionaries}], "UserId": "YOUR_GOOGLE_MAPS_API_KEY", "Id": "xyz"}},
2023-08-31 12:49:13
)
)]
它本质是一个数组套数组的结构,每个子数组里包含3个元素:字符串请求、字典格式的预测数据、日期字符串。也就是结构是[[Any]](二维任意类型数组)。
但你的代码里却尝试把它转成[[[String: Any]]]——这是「数组套数组套字典」的三维结构,和实际返回的JSON结构完全不匹配!所以jsonResponse["past_predictions"] as? [[[String: Any]]]会直接返回nil,整个if let分支被跳过,自然不会执行里面的打印和解析逻辑。
修复方案
把类型转换改成正确的[[Any]],然后遍历每个子数组,取出里面的字典元素进行解析:
do { if let jsonResponse = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any], // 这里把类型改成[[Any]],匹配真实的JSON结构 let pastPredictionsArray = jsonResponse["past_predictions"] as? [[Any]] { var allDecodedPredictions: [Prediction] = [] print("****:", pastPredictionsArray) for predictionEntry in pastPredictionsArray { // 每个子数组的第二个元素(索引1)是我们需要的预测字典 if let predictionData = predictionEntry[1] as? [String: Any] { do { let jsonData = try JSONSerialization.data(withJSONObject: predictionData, options: []) let decodedData = try JSONDecoder().decode(Prediction.self, from: jsonData) allDecodedPredictions.append(decodedData) } catch { print("Error decoding prediction:", error) } } } DispatchQueue.main.async { self.decodedPredictions = allDecodedPredictions self.isLoading = false } } } catch { // 别忘了捕获外层do的错误,之前你没处理这里的异常 print("Error parsing JSON:", error) }
额外建议
如果可以的话,建议和后端同学沟通,把past_predictions的结构改成更清晰的字典格式,比如:
"past_predictions": [ { "request": "Sample_Request_String", "prediction": {"Status": "Pass", ...}, "date": "2023-08-31 12:49:28" } ]
这种结构可读性更强,前端解析也不容易出类型匹配的错误。
备注:内容来源于stack exchange,提问作者Vampavi

