【问题标题】:How to get data from JSON with different keys?如何使用不同的键从 JSON 中获取数据?
【发布时间】:2017-09-22 07:37:30
【问题描述】:

JSON 看起来像这样:

{
"00AK": {
    "icao": "00AK",
    "iata": "",
    "name": "Lowell Field",
    "city": "Anchor Point",
    "country": "US",
    "elevation": 450,
    "lat": 59.94919968,
    "lon": -151.695999146,
    "tz": "America\/Anchorage"
},
"00AL": {
    "icao": "00AL",
    "iata": "",
    "name": "Epps Airpark",
    "city": "Harvest",
    "country": "US",
    "elevation": 820,
    "lat": 34.8647994995,
    "lon": -86.7703018188,
    "tz": "America\/Chicago"
},
"00AZ": {
    "icao": "00AZ",
    "iata": "",
    "name": "Cordes Airport",
    "city": "Cordes",
    "country": "US",
    "elevation": 3810,
    "lat": 34.3055992126,
    "lon": -112.1650009155,
    "tz": "America\/Phoenix"
}
}

如您所见,键有“00AK”、“00AL”、“00AZ”等等。如何解析这种格式的 JSON?

【问题讨论】:

  • 键对解析有什么影响?只需像其他任何方法一样解析 json,您的实际问题是如何从解析的 json 中检索数据?
  • 你可以google一下,搜索关键字jsonObject。那里有大量的样本。祝你好运!

标签: json swift swift3


【解决方案1】:
let jsonData = //JSON DATA HERE
do {
    let dict = try NSJSONSerialization.JSONObjectWithData(jsonData, options: []) as! NSDictionary
    for (key, value) in dict {
        let subDict = value as! NSDictionary
        //Then you can access the values from subDict
    } catch {
        //ERROR HANDLING    
    }

【讨论】:

  • 你不应该在 Swift 中使用 NSDictionary,最好使用像 [String: Any] 这样的 Swift 字典。此外,您不应强制施法,而应处理可能的施法失败。
  • 同意。我只是给出了这个过程的基本要点。
【解决方案2】:

所以我在这里声明一个结构如下

struct Model {
var iaco: String?
var iata: String?
var name: String?
var city: String?
var country: String?
var elevation: Int?
var lat: Double?
var lon: Double?
var tz: String? }

然后在数组上声明保存响应结果

var listOfModels = Array<Model>()

然后从响应字典中获取一个键列表并对其进行迭代以获取结果并将其存储在数组中

  handleResponse { (response) in
        for key in response.keys {
            let dict = response[key] as? [String:Any]
            var model = Model()
            model.iaco = dict?["icao"] as? String
            model.iata = dict?["iata"] as? String
            model.name = dict?["name"] as? String
            model.city = dict?["city"] as? String
            model.country = dict?["country"] as? String
            model.elevation = dict?["elevation"] as? Int
            model.lat = dict?["lat"] as? Double
            model.lon = dict?["lon"] as? Double
            model.tz = dict?["tz"] as? String
            listOfModels.append(model)
        }
    }

response.keys 用于从字典中获取键列表。

【讨论】:

    【解决方案3】:

    你可以试试下面的sn-p:

    func parseData() {
        let jsonData = Data() /// your actual response data goes here...
        do {
            let dict = try JSONSerialization.jsonObject(with: jsonData, options: .allowFragments)
            guard let swiftDict = dict as? [String : Any] else {
                print("Not a valid response")
                return
            }
    
            for (key, value) in swiftDict {
                guard let valueDict = value as? [String: Any] else {
                    /// handle improper response here
                    return
                }
    
                /// Got the actual dictionary in 'valueDict'...
            }
        }
        catch {
                /// handle parsing error here
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-07
      • 2016-05-26
      • 2021-12-01
      • 1970-01-01
      • 2017-07-20
      • 2021-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多