如何使用 Swift 3.0 解析这个 JSON 对象
Posted
技术标签:
【中文标题】如何使用 Swift 3.0 解析这个 JSON 对象【英文标题】:How can I parse this JSON object using Swift 3.0 【发布时间】:2016-12-14 09:18:18 【问题描述】:我正在尝试解析从新 API 返回的 JSON 字符串。返回的 JSON 字符串如下所示。
QuerySearchResult":
"StartAt":"1",
"Count":"40",
"TotalAvailable":"500",
"Items":[
"TITLE":"OST420 Generation",
"PATH":"http:\\Test.pdf",
"WRITE":"2016-12-12T15:47:42",
"RANK":"32286574",
"SIZE":"145091",
"ISDOCUMENT":"true",
"ID":"18548",
"WPTASK":"Onsite Generation",
"WPDOCTYPE":"Local Operating Procedure",
"WPDOCREFID":"304580",
"WPCONTENTTYPE":"Document",
"TITLE":"OST420 Measurement",
"PATH":"http:\Test33.pdf",
.
.
我正在使用下面的代码,它接受 JSON 变量,但在我尝试加载项目时失败。我试过在Dictionary
周围使用Array
,但它仍然失败。我需要在 Items 中阅读什么声明?
if let json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as? Dictionary<String, AnyObject>
for item in json
if let dict = item as? Dictionary<String, AnyObject>
if let items = json["Items"] as? Array<Dictionary<String, AnyObject>>
for rec in items
if let title = rec["TITLE"] as? String
let xx = title
【问题讨论】:
如果你不明白 JSON 是如何工作的,你可以从打印出你命名为“json”的 jsonObject 开始,然后自己看看它是如何存储的,从那里你会更清楚地了解它是如何存储的访问每个数据。 没有日志什么的?你怎么知道那是哪一部分失败了? 【参考方案1】:首先,您也没有正确地遍历Dictionary
,而不是循环遍历Dictionary
来访问单个值,尝试通过subscripting
直接访问它,而Swift 3 中Dictionary
的正确JSON 表示法是[String : Any]
.
if let json = try? JSONSerialization.jsonObject(with: data!, options: []) as? [String : Any],
let queryDic = json["QuerySearchResult"] as? [String : Any],
let items = queryDic["Items"] as? [[String : Any]]
for item in items
if let title = item["TITLE"] as? String
print(title)
【讨论】:
在if let
循环中的if let
语句中更改item
而不是rec
。
@user616076 欢迎朋友 :)【参考方案2】:
在 Swift 3.1 中:-
func parseJson(anyObj:AnyObject)
if let anyObj = anyObj as? Array<Dictionary<String,AnyObject>>
self.yourArrayName = anyObj.flatMap(yourModelName(json:$0) )
【讨论】:
【参考方案3】:Json将数据返回成字典和数组格式,所以把json数据当成是这样,这样更容易理解。
大括号“”和“”中的数据是字典。
大括号'['或']'中的数据是数组。
现在开始通过字典和数组属性解析 json 数据,它确实有效。或者为了确认打印你的 json 数据。
【讨论】:
【参考方案4】:使用SwiftyJSON :它比您的代码更容易解析JSON。
那么,我们如何使用它进行解析?
首先将您的响应设为 Data()
let jsonData = JSON(data: results!)
接下来我们如何解析 JSON。
import Foundation
import SwiftyJSON
enum JSONParseError : ErrorType
case UnknownField
case EmptyJSON
extension JSONParseError : CustomStringConvertible
var description: String
switch self
case .UnknownField:
return "Error when parsing json because there is no field"
case .EmptyJSON:
return "Error when parsing empty json"
guard let querySearchResult : [String : JSON] = jsonData["QuerySearchResult"].dictionary else
throw JSONParseError.UnknownField
guard let startAt : String = querySearchResult["StartAt"].string else
throw JSONParseError.UnknownField
guard let count : String = querySearchResult["Count"].string else
throw JSONParseError.UnknownField
guard let totalAvailable : String = querySearchResult["TotalAvailable"].string else
throw JSONParseError.UnknownField
guard let items : [JSON] = querySearchResult["Items"].array else
throw JSONParseError.UnknownField
if items.count > 0
for i in 0 ..< items.count
guard let title = items[i]["TITLE"].string else
throw JSONParseError.UnknownField
.... //So On
else
throw JSONParseError.EmptyJSON
【讨论】:
以上是关于如何使用 Swift 3.0 解析这个 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 3.0 中访问从 iTunes API 解析的 JSON 对象
如何使用 Alamofire 在 Xcode 8 Swift 3.0 中获取特定的 JSON?