快速解析从 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 形式返回的对象的主要内容,如果未能解决你的问题,请参考以下文章

golang 快速解析api 返回的data数据

httpclient以json形式参数调用http接口并解析返回的报文

来自virustotal api的Json解析结果

我无法解析从 NSURL 会话返回的 JSON。我究竟做错了啥?

如何以正确的方式在 IOS SWIFT 3 中解析 Google 距离矩阵 API JSON

SpringBoot常用注解解析