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

JSON二次解析失败导致代码逻辑未执行的问题求助

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 14:19:31