使用Swifty JSON解析数组

时间:2016-12-10 15:01:54

标签: ios json swift swifty-json

这是我要解析的json(例子):

[
  {
    "id": 1,
    "name": "Team name",
    "shower": {
      "id": 1,
      "status": 1,
      "startLocation": {
        "id": 1,
        "name": "abc 16"
      }
    }
  },
  {
    "id": 2,
    "name": "Team name",
    "shower": {
      "id": 2,
      "status": 1,
      "startLocation": {
        "id": 1,
        "name": "efg 16"
      }
    }
  }
]

如你所见,它是一个阵列(团队)。 我需要得到每个团队并用它做点什么。

经过多次尝试,我尝试使用SwiftyJSON,因为我觉得它会更容易。但是,它对我没用。

这就是我的尝试:

let array = JSON(response)  

// print each subJSON in array
for team in array.arrayValue {                    
  print(team)                    
}

但循环不起作用。它根本不会进入循环。 也许它不明白我的json是一个数组。

我可以在调试器中看到数组对象。它看起来像这样:

enter image description here

我如何获得这些子JSON?

感谢。

6 个答案:

答案 0 :(得分:1)

我认为你应该使用

let array = JSON(parseJSON: response) 

而不是

let array = JSON(response)

答案 1 :(得分:0)

SwiftyJSON包含将JSON字符串解析为JSON对象的方法,请检查documentation

/**
 Parses the JSON string into a JSON object
 - parameter json: the JSON string
 - returns: the created JSON object
*/

 public init(parseJSON jsonString: String) {
   if let data = jsonString.data(using: .utf8) {
                self.init(data)
            } else {
                self.init(NSNull())
            }        
   }       


/**
 Creates a JSON from JSON string
 - parameter string: Normal json string like '{"a":"b"}'

 - returns: The created JSON
 */
@available(*, deprecated: 3.2, message: "Use instead `init(parseJSON: )`")
public static func parse(json: String) -> JSON {
    return json.data(using: String.Encoding.utf8)
        .flatMap{ JSON(data: $0) } ?? JSON(NSNull())
}

或者您可以将子字符串转换为子对象,如

斯威夫特3:

let dataFromString = response.data(using: .utf8)
let jsonArray = JSON(data: dataFromString!)

答案 2 :(得分:0)

在以下示例中,我将队名保存在数组中。我测试了它。

var names = [String]()
if let array = json.array {
    for i in 0..<array.count {
        let name = array[i]["name"]
        names.append(name.stringValue)
    }
}

print(names) // ["Team name", "Team name"]

答案 3 :(得分:0)

这是Swift 5的答案。就我而言,数据响应如下:

[
  {
    "Name": "Some Type",
    "Data": [
      {
        "ParentId": 111,
        "Code": "Personal",
        "SortOrder": 1,
        "Name": "Personal",
        "Id": 323
      },
      {
        "ParentId": null,
        "Code": "Work",
        "SortOrder": 2,
        "Name": "Work",
        "Id": 324
      }
    ],
    "KeyType": "Integer"
  },
  {
    "Name": "Phone Type",
    "Data": [
      {
        "ParentId": null,
        "Code": "Phone",
        "SortOrder": 1,
        "Name": "Phone",
        "Id": 785
      },
      {
        "ParentId": null,
        "Code": "Cell",
        "SortOrder": 2,
        "Name": "Cell",
        "Id": 786
      },
      {
        "ParentId": null,
        "Code": "Fax",
        "SortOrder": 3,
        "Name": "Fax",
        "Id": 787
      },
      {
        "ParentId": null,
        "Code": "Home",
        "SortOrder": 4,
        "Name": "Home",
        "Id": 788
      },
      {
        "ParentId": null,
        "Code": "Office",
        "SortOrder": 5,
        "Name": "Office",
        "Id": 789
      }
    ],
    "KeyType": "Integer"
  }
]

我用以下代码处理了它。

struct responseObjectClass:BaseModel {
    var responsearray: [arrayData]? = nil

    init(json: JSON) {
        responsearray = json.arrayValue.map { arrayData(json: $0) }
    }
}

struct arrayData:BaseModel {
    let Name: String?
       var DataValue: [DataLookup]? = nil
       let KeyType: String?
       
       init(json: JSON) {
           Name = json["Name"].stringValue
           DataValue = json["Data"].arrayValue.map { DataLookup(json: $0) }
           KeyType = json["KeyType"].stringValue
       }
}

struct DataLookup:BaseModel {
    
    
    let ParentId: Any?
    let Code: String?
    let SortOrder: Int?
    let Name: String?
    let Id: Int?
    
    init(json: JSON) {
        ParentId = json["ParentId"]
        Code = json["Code"].stringValue
        SortOrder = json["SortOrder"].intValue
        Name = json["Name"].stringValue
        Id = json["Id"].intValue
    }
}

BaseModel是可选的,仅用于初始化Json。

protocol BaseModel {
  init(json: JSON)
}

答案 4 :(得分:-1)

没有SwiftyJSON

以下是有效的JSON

data.json 文件

[{
  "id": 1,
  "name": "Team name",
  "shower": {
        "id": 1,
        "status": 1,
        "startLocation": {
  "id": 1,
  "name": "abc 16"
        }
  }
  }, {
  "id": 2,
  "name": "Team name",
  "shower": {
        "id": 2,
        "status": 1,
        "startLocation": {
  "id": 1,
  "name": "efg 16"
        }
  }
}]

以下是阅读json的代码。

if let path = Bundle.main.path(forResource: "data", ofType: "json") {
        let url = URL(fileURLWithPath: path)
        do {
            let data = try Data(contentsOf: url)
            if let jsonArray = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? NSArray {
                for (_, item) in jsonArray.enumerated() {
                    let itemDict = item as! NSDictionary
                    let id = itemDict["id"] as! Int
                    let name = itemDict["name"] as! String
                    let shower = itemDict["shower"] as! NSDictionary

                    let showerId = shower["id"] as! Int
                    let showerStatus = shower["status"] as! Int
                    let startLocation = shower["startLocation"] as! NSDictionary


                    let startLocationId = startLocation["id"] as! Int
                    let startLocationName = startLocation["name"] as! String

                }
            }
        } catch {
            print("Error: \(error.localizedDescription)")
        }
}

答案 5 :(得分:-1)

这对我有用:

   // Convert JSON to Array
    func JSONToArray(_ json: String) -> Array<Any>? {
        if let data = json.data(using: String.Encoding.utf8) {
            do {
                return try JSONSerialization.jsonObject(with: data, options: []) as? Array
            } catch let error as NSError {
                print(error)
            }
        }
        return nil
    }

使用此功能后,我可以通过子JSON循环。

感谢。