【问题标题】:How can I parse this JSON object using Swift 3.0如何使用 Swift 3.0 解析这个 JSON 对象
【发布时间】:2025-11-29 19:50:01
【问题描述】:

我正在尝试解析从新 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 开始,然后自己看看它是如何存储的,从那里你会更清楚地了解它是如何存储的访问每个数据。
  • 没有日志什么的?你怎么知道那是哪一部分失败了?

标签: ios arrays json swift swift3


【解决方案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         
      }
      

      【讨论】: