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.value
是 Any
类型,它不是字典,因此您可以使用下标(您可以通过在其上执行 ["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 数组响应的某些部分