【问题标题】:Decoding nested JSON with Swift 4使用 Swift 4 解码嵌套的 JSON
【发布时间】:2018-06-03 06:59:26
【问题描述】:

JSON =

{
"html_attributions": [],
"results": [
               {
                  "geometry": {},
                   "name": "Cruise Bar, Restaurant & Events",
                   "vicinity": "Circular Quay W, Sydney"
                },
                {}
],
"status": "OK"
}

如果名称嵌套在结果中,我如何检索它?

【问题讨论】:

  • 你试过什么解码逻辑?
  • 简单的 var name: String, var rating: Int
  • 不,不止于此。显示一些代码。解析,解码。还有……rating 是从哪里来的?
  • SO 不是“为我编写代码”服务。展示您已经尝试过的方法以及遇到的问题

标签: json swift swift4 decode


【解决方案1】:

Sam 试试这个,我使用 Json 在操场上编写示例代码。 root.results 将为您提供字典数组,您可以轻松遍历并从中获取所需的名称。

import UIKit

struct Root: Codable {
    let results: [Results]?

    private enum CodingKeys: String, CodingKey {
    case results = "results"
   }

}

struct Results: Codable {
   let name: String?
   let vicinity: String?
}

let url = Bundle.main.url(forResource: "data", withExtension: "json")
let data = NSData(contentsOf: url!)


do {
      let root = try JSONDecoder().decode(Root.self, from: data as! Data)

      if let name = root.results?.first?.name {
          print(name)
      }    

} catch let error as NSError {

    print(error.description)
}

这是我用过的json。

{
"results": [{
            "name": "Cruise Bar, Restaurant & Events",
            "vicinity": "Circular Quay W, Sydney"
            }]
}

【讨论】:

  • 谢谢 Shauket,我应该把 URL 放在哪里
  • url 是您的 json 路径,在您的情况下,您从服务器端获取数据只需省略此步骤 let url = Bundle.main.url(forResource: "data", withExtension: "json")让数据 = NSData(contentsOf: url!)
  • 我没有投反对票,实际上我投了赞成票。你的回答对我很有效
【解决方案2】:

你可以这样做:

型号:

 import Foundation
struct HtmlInitial: Codable {
    let results: [Result]?
    let status: String

    enum CodingKeys: String, CodingKey {
        case results, status
    }
}

struct Result: Codable {
    let name, vicinity: String?
}

extension HtmlInitial {
    init(data: Data) throws {
        self = try JSONDecoder().decode(HtmlInitial.self, from: data)
    }
}

像这样使用模型:

let url = Bundle.main.url(forResource: "APIResponse", withExtension: "json")!

if  let data = try? Data.init(contentsOf: url) ,
    let initial = try? HtmlInitial.init(data: data),
    let result = initial.results?[0] {
    print(result.name)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2018-08-06
    相关资源
    最近更新 更多