【问题标题】:Difficulty Parsing JSON With Alamofire使用 Alamofire 难以解析 JSON
【发布时间】:2017-01-26 19:35:26
【问题描述】:

我有这个sn-p的代码:

Alamofire.request("https://api.waqi.info/feed/geo:10.3;20.7/?token=demo").responseJSON { response in
        print(response.result)   // result of response serialization

        if let JSON = response.result.value {
            print("JSON: \(JSON)")
        }

        guard let JSON = response.result.value as? [String:Any],
            let data = JSON["data"] as? [[String:Any]] else {
                print("Could not parse weather values")
                return
        }

几天前它似乎还在工作,但现在当我运行应用程序时,它会打印出无法解析天气值,表明它没有正确解析 JSON 数据。我已经回去把它改成了以前的样子,但它似乎还是坏了。

我希望这里的人能够帮助我解决这个问题,因为这是我将发布到 App Store 的第一个项目的重要组成部分。

编辑:只是补充一下,它成功地在print("JSON: \(JSON)") 行打印了 JSON 数据

【问题讨论】:

  • 您能告诉我们从print("JSON: \(JSON)") 打印的内容吗?我有一种感觉,我知道它是什么,但看到 JSON 输出总是很高兴..
  • 一般不建议重复发布,尤其是您自己的问题。你应该可以去检查你过去的问题以获得这个问题的答案。

标签: json swift swift3 alamofire


【解决方案1】:

需要我逐字发布您上次发布此问题时的回复吗?

您可以在 JSON 打印输出之后解析您的结果 回复:

guard let JSON = response.result.value as? [String:Any],
    let weather = JSON["weather"] as? [[String:Any]] else {
    print("Could not parse weather values")
    return
}

for element in weather {
    if let description = element["description"] as? String {
        print(description)
    }
}

如果你想保存结果,或者基于某个特定的东西做某事 结果如您所述,您可以插入其他内容而不是 只需print(description) 喜欢:

if description == "sunny" {
    //do something
}

让我知道这是否有意义。请记住,() 在 Xcode 控制台的意思是“数组”。

我真的应该将其标记为 Save Alamofire Result as Variable? 的副本

编辑:基于这个 JSON sn-p - http://pastebin.com/XiGhNA26 - 它应该很容易解析出所需的信息:

guard let JSON = response.result.value as? [String:Any],
    let data = JSON["data"] as? [String:Any] else
{
    print("Could not parse weather values")
    return
}

不同的是,在这个 JSON 响应中,“data”参数不是一个字典数组,它只是一个字典本身。

【讨论】:

  • 抱歉,我真的应该把它贴在原来的帖子上,但这里是控制台的输出:pastebin.com/XiGhNA26 我使用了你提供的原始代码,但调整了变量名以用于新的网址。
  • 查看编辑@Miles 根据 JSON 输出,您的问题原因很明确
  • 我以为是这种情况,我只是不知道如何调整代码,我仍然可以使用for element in weather { if let description = element["description"] as? String { print(description) } } 从数据数组中提取信息还是需要调整这也是?
  • 不,您将无法再使用它。 data 不再是一个数组,因此这个简单的for 循环将不起作用,并且此 JSON 响应中不存在 "description"。 @迈尔斯
  • 效果很好,再次感谢您的帮助。也为双重职位道歉。此外,一旦我有更多的可支配收入,我将与您联系,为您的 Mealsloth 项目捐款,部分原因是感谢您,部分原因是我认为这是个好主意!
【解决方案2】:

在你的守卫声明中,你做了两次同样的事情。那没有必要。看看这段代码并测试一下。我现在无法测试您的代码,但我相信错误出现在向下转换发生的区域附近。我相信改进会对您有所帮助。

Alamofire.request("https://api.waqi.info/feed/geo:10.3;20.7/?token=demo").responseJSON { response in
    print(response.result)   // result of response serialization

    if let JSON = response.result.value {
        print("JSON: \(JSON)")

        let parsed = JSON as? NSDictionary //Here is your son data ready to be used
        //We can access the data content
        let data = parsed["data"] //The data is here and can be access using keys
        print("Data: \(parsed["data"])")
    }else{
       print("Values don't exists")
       return
    }

    }

【讨论】:

  • response.result.value 被解包两次可能是真的,但这不是问题的根源,也没有回答 OP 的问题。
猜你喜欢
  • 2017-10-15
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
相关资源
最近更新 更多