转换 JSON 个嵌套对象

Convert JSON nested objects

我从 Foursquare API 得到以下 JSON,我一直在努力提取数据:

{
  "meta":{
    "code":200,
    "requestId":"58122e59498e5506a1b23580"
  },
  "response":{
    "venues":[
      {
        "id":"4d56c381a747b60cd4a12c2b",
        "name":"Sports Circle",
        "contact":{},
        "location":{
          "lat":31.9,
          "lng":35.9,
          "labeledLatLngs":[
            {
              "label":"display",
              "lat":31.9,
              "lng":35.90
            }
          ],
      ],
      "confident":true
    }
  }
}

除了 latlng 值之外,我还想在 venues 中获取 name。到目前为止我已经尝试过了,但是它从 JVenues 的第二个 if 语句中退出,因为它是 nil:

func parseData (JSONData: Data){
    do {
        var readableJson = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! [String:AnyObject]

        if let JResponse = readableJson ["response"] as? [String:AnyObject] {
            if let JVenues = JResponse["venues"] as? [String:AnyObject]{
                if let JName = JVenues["name"] as? String{
                    NSLog(JName)
                }
            }
        }
    } catch {
        print(error)
    }
}

这就是其他答案的意思。如果您能看到所有内容,可能会更有意义...

if let JResponse = readableJson ["response"] as? [String : AnyObject] {
    if let JVenues = JResponse["venues"] as? [[String : AnyObject]] {
        if let JName = JVenues.first?["name"] as? String {
            NSLog(JName)
        }
    }
}

请注意,这只会获取场地数组中的第一个名称。

编辑:

我更喜欢这样的东西。定义一个结构并将您的字典转换为该结构:

struct Venue {
    var name: String?
    var venueId: String?

    init(_ venueDictionary: [String : AnyObject]) {
        self.name = venueDictionary["name"] as? String
        self.venueId = venueDictionary["id"] as? String
    }
}

在您的 class 中创建一个 属性 例如:

var venues = [Venue]()

从您的 JSON 将词典映射到场地数组。为了约定,我重命名了以大写字母开头的变量。

if let response = readableJson ["response"] as? [String : AnyObject] {
     if let responseVenues = response["venues"] as? [[String : AnyObject]] {
         self.venues = responseVenues.map({ Venue([=13=])) })
     }
 }

在 class 中的任意位置使用,例如:

let venue = self.venues.first
print(venue?.name)

或:

if let venue = self.venues.find({ [=15=].name == "Sports Circle" }) {
    print("found venue with id \(venue.venueId)")
}