如何迭代JSON

时间:2017-11-21 22:40:15

标签: json swift

我有一个对API执行GET请求的方法:

public func getApiData(completion: @escaping () -> (), fullUrl: String)
{
    let session = URLSession.shared
    let url = URL(string: fullUrl)!

    let task = session.dataTask(with: url) { (data, _, _) -> Void in
        if let data = data {

            self.serializeToJSON(jsonData: data)
            completion()
        }
    }
    task.resume()
}

使用SwiftyJSON然后我将数据转换为JSON:

private func serializeToJSON(jsonData: Data) {

    self.json = JSON(data: jsonData)

    print(self.json)

    for (index,item) in self.json {
        print("hi")
    }
}

打印完整的JSON:

[{"TenantID":1,"Tenant1":"RAC"},{"TenantID":2,"Tenant1":"VictorMillwell"},{"TenantID":3,"Tenant1":"Comfort"},{"TenantID":4,"Tenant1":"Greenlight"}]

然而,由于print("hi")没有被执行,JSON无法迭代,我不知道为什么,我已经在互联网上到处查看了解为什么它没有迭代,我似乎无法理解为什么。

有谁知道为什么?

2 个答案:

答案 0 :(得分:1)

有一个很好的教程here,但在manual它说你可以像这样循环:

// If json is .Dictionary
for (key,subJson):(String, JSON) in self.json {
    // Do something you want
}

// If json is .Array
// The `index` is 0..<json.count's string value
for (index,subJson):(String, JSON) in self.json {
    // Do something you want
}

如果你不知道它是字典还是数组,也许你可以这样做:

switch self.json.type {
    case .array:
        for (index,subJson):(String, JSON) in self.json {
            // Do something you want
        }
    case .dictionary:
        for (key,subJson):(String, JSON) in self.json {
            // Do something you want
        }
    default:
        // Do some error handling
    }

答案 1 :(得分:0)

目前尚不清楚为什么要枚举JSON。在Swift 4中解码这个JSON是微不足道的:

struct Tenant:Decodable { let TenantID:Int; let Tenant1:String }
let arr = try! JSONDecoder().decode([Tenant].self, from: data)

现在arr是租户的Swift数组,其中每个租户都有TenantID属性和Tenant1属性。现在,您可以使用该阵列做任何您喜欢的事情,包括如果您愿意,可以骑自行车。