如何使用 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 对象的主要内容,如果未能解决你的问题,请参考以下文章

JSON图像解析IOS Swift 3.0

在 Swift 3.0 中访问从 iTunes API 解析的 JSON 对象

Swift 3.0 中的 JSON 解析失败

如何使用 Alamofire 在 Xcode 8 Swift 3.0 中获取特定的 JSON?

如何使用 Codable 和 Swift 解析这个嵌套的 JSON?

如何在 Swift 3 中使用 Alamofire 4 解析这个 json?