Alamofire 无法访问 json 响应的键

Posted

技术标签:

【中文标题】Alamofire 无法访问 json 响应的键【英文标题】:Alamofire can't access keys of json response 【发布时间】:2017-06-04 21:32:32 【问题描述】:

我刚开始使用 Alamofire,遇到了一个问题。我可以运行以下代码来打印来自 API 端点的所有数据。

Alamofire.request("http://codewithchris.com/code/afsample.json").responseJSON  response in
    if let JSON = response.result.value 
        print(JSON)
    

问题是当我运行这个时:

Alamofire.request("http://codewithchris.com/code/afsample.json").responseJSON  response in
    if let JSON = response.result.value 
        print(JSON["firstkey"])
    

我得到错误:

类型 'Any' 没有下标成员

我不知道为什么会发生这个错误,好像我正在正确访问数据。任何帮助都会很棒,谢谢!

我已经尝试使用两者来格式化它:

print(JSON["firstkey"] as String)

print(JSON["firstkey"] as [String:Any]

但他们仍然给出同样的错误。

这是我端点上的 JSON:


    "firstkey":"it worked!",
    "secondkey":["item1", "item2", "item3"]

【问题讨论】:

“类型 'Any' 没有下标成员”:知道错误。你搜索过吗? JSON/response.result.valueAny 类型,它不是字典,因此您可以使用下标(您可以通过在其上执行 ["firstKey"] 来实现)。您必须指定 i 是一本字典,方法是执行 as [String:Any] 之类的操作 Correctly Parsing JSON in Swift 3的可能重复 @Larme 我已经搜索了错误并尝试执行 print(JSON["firstkey"] as String)print(JSON["firstkey"] as [String:Any] 都给出相同的错误 Tyep 'Any' has no subscript members (我将绕过 print ):JSON["firstkey"] as [String:Any]) => 意思是:将 JSON["firstkey"] 视为字典对象(哪些键是字符串),而不是将 JSON 视为字典对象(哪些键是字符串)。那是不同的。 @Larme 很抱歉,但这对我来说没有多大意义。我对 Swift 很陌生,我知道大部分基础知识,但是使用它进行 API 调用对我来说是非常新的。您能否提供更多信息,说明我实际上需要做什么才能致电json["firstkey"] 并获得价值? 【参考方案1】:

这真的很简单。你只需要强制转换(as!)你的 JSON。所以把你的代码改成这个就行了:

Alamofire.request("http://codewithchris.com/code/afsample.json").responseJSON  response in
    if let JSON = response.result.value 
        let json = JSON as! [String: Any]
        print(json["firstkey"])
    

编辑 1: 正如您在 cmets 中所说,您正在使用 SwiftyJSON 包。示例代码如下:

Alamofire.request("http://codewithchris.com/code/afsample.json").responseJSON  response in
        if let value = response.result.value 
            let json = JSON(value)
            print(json["firstkey"].stringValue)
        
    

Alamofire.request("https://mmcalc.com/api").responseJSON  response in
        if let value = response.result.value 
            let json = JSON(value)
            print(json.arrayValue[0]["uniqueUsers"].stringValue)
        
    

【讨论】:

这似乎有效,但只是部分有效。我现在正在尝试另一个api,但由于索引,我无法访问密钥。有没有办法我可以解析这个并得到一个简单的对象,我可以去json[0]["key"] 我建议您使用SwiftyJson 将您的 json 解析为 JSON 对象。它使您的工作更轻松。如果您不使用 SwiftyJSON 之类的 json 解析器,则必须为您使用的每个 api 找到正确的格式。 我在我的项目中使用 SwiftyJson,这样做会很简单吗?你能举个例子吗? 谢谢,非常感谢! 不客气,不要忘记在文件顶部导入 SwiftyJSON。【参考方案2】:

您正在尝试通过获取对象来获取值,试试这个:

Alamofire.request("http://codewithchris.com/code/afsample.json").responseJSON  response in
if let result = response.result.value 
    let JSON = result as! NSDictionary
    print(JSON["firstkey"])


希望它会起作用!

【讨论】:

【参考方案3】:

你应该添加!在代码的末尾)强制解开值

   Alamofire.request("http://codewithchris.com/code/afsample.json").responseJSON  response in
      if let JSON = response.result.value 
      let json = JSON as! [String: Any]
      print(json["firstkey"]!)
   

【讨论】:

我们也可以使用这段代码 Alamofire.request("codewithchris.com/code/afsample.json").responseJSON response in if let JSON = response.result.value let json = JSON as! [String: Any] print(json[ "firstkey"] 作为任何)

以上是关于Alamofire 无法访问 json 响应的键的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 alamofire 深入了解响应 json。迅速

如何显示来自 Alamofire 请求的 JSON 数组响应的某些部分

Swift Alamofire 无法解析 POST 请求中的响应 JSON 字符串

无法使用 SwiftyJSON 访问 JSON 数据

似乎无法使用 Alamofire 获取缓存的响应

我应该如何使用 Alamofire 和 SwiftyJSON 解析来自 API 的 JSON 响应?