如何使用Swift 3.0解析此JSON对象

时间:2016-12-14 09:18:18

标签: ios arrays json swift swift3

我正在尝试解析从新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变量但在我尝试加载项时失败。我尝试在Array周围使用Dictionary,但仍然失败。我需要在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
               }
            }
        }
   }
}

4 个答案:

答案 0 :(得分:3)

首先,您没有正确地遍历Dictionary,而不是循环访问Dictionary以访问单个值,请尝试直接通过subscripting访问它并使用Dictionary的正确JSON表示法Swift 3中的{1}}是[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)
         }
     }
}

答案 1 :(得分:3)

在Swift 3.1中: -

func parseJson(anyObj:AnyObject) {

            if  let anyObj = anyObj as? Array<Dictionary<String,AnyObject>> {
                self.yourArrayName = anyObj.flatMap({yourModelName(json:$0) })
            }   
        }

答案 2 :(得分:0)

使用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         
}

答案 3 :(得分:0)

Json将数据返回到字典和数组格式中,因此将json数据视为一样,它使您更容易理解。

大括号'{'和'}'中的数据是字典。

和大括号'['或']'中的数据是数组。

现在开始通过它完全有效的字典和数组属性解析json数据。或者确认打印您的json数据。