快速解析从 API 以 JSON 形式返回的对象
Posted
技术标签:
【中文标题】快速解析从 API 以 JSON 形式返回的对象【英文标题】:Parse an object returned as JSON from API in swift 【发布时间】:2016-12-20 10:54:07 【问题描述】:我从REST API
迅速收到了一个响应对象(res)。它是类型的。 __NSArrayM
。它包含我要解析的 JSON 格式字符串。
JsonResult = "[ \"IsAuth\":\"true\" ]";
这是一个很长的 JSON 字符串,为了简单起见,我将其缩短了。
要解析 json,对象需要是 Dictionary 类型,但我不能将 __NSArrayM
类型的对象转换为它。
我搜索了很多,但无论如何都无法读取这个 JSON 字符串。
附加:我尝试转换响应对象的任何对象。我得到了错误 -
无法将“__NSArrayM”(0x107e86c30) 类型的值转换为“NSData”(0x107e86168) 或我转换为的任何数据类型。
【问题讨论】:
不要试图在 Swift 中复制你的 Objective-C 习惯。例如,不要使用 NSArray/NSDictionary,而是使用 Swift 集合等。 是的,我知道,但这两种方式都不起作用。To parse a json, the object needs to be of type NSDictionary
否。在 JSON 中,根对象需要是数组或字典。并且不要混淆 NSArray / Swift Array / JSON 数组。 :)
but it doesn't work either ways
什么不起作用?数组不是字典。你不能神奇地将一个投射到另一个......
它不适用于 NSDictionary 而不是 Dictionary。虽然我纠正了自己。
【参考方案1】:
让我们一步一步来。
你说你有一个名为“res”的对象,它的类型是__NSArrayM
,并且包含这个东西:
JsonResult = "[ \"IsAuth\":\"true\" ]";
这意味着你已经将JSON转换为一个对象,即一个NSArray。
在这个我们看不到的数组中,您向我们展示的这个东西是一个字典(我们将其命名为“dict”),它的值是一个 String,它本身表示另一个 JSON 对象。
让我们使用键获取值:
if let value = dict["JsonResult"] as? String
print(value)
现在“值”应该是"[ \"IsAuth\":\"true\" ]"
。
这是 一个字符串,它代表 JSON。要解码 JSON,我们首先必须将字符串转换为数据,然后才能解码:
if let data = value.data(using: .utf8)
if let content = try? JSONSerialization.jsonObject(with: data, options: []),
let array = content as? [[String: Any]]
print(array)
【讨论】:
以上是关于快速解析从 API 以 JSON 形式返回的对象的主要内容,如果未能解决你的问题,请参考以下文章
httpclient以json形式参数调用http接口并解析返回的报文
我无法解析从 NSURL 会话返回的 JSON。我究竟做错了啥?