ios - Swift 4 JSON 解码器

标签 ios json swift swift4 decodable

我知道其他问题已经涵盖了这一点,但我已经关注了它们,但我仍然感到困惑。这是我的 JSON 结构:

      {
       "FindBoatResult": {
       "num_boats": 10,
       "boat": [
         {
           "num_segments": 1,
           "segments": [
              {
               "ident": "String",
                "origin" : {
                         "code" : "String"
                 },
           },
         ]
        }

等等...但这与结构一样深。每个 JSON 响应中有多个“段”返回。在 Swift 中,我有这段代码。

struct Result : Decodable {
    let FindBoatResult : FindBoatResult
}
struct FindBoatResult : Decodable {
    let boats : Boats
    let num_boats : Int
}
struct Boats : Decodable {
    let segments : [Segments]
}
struct Segments : Decodable {
    let ident : String?
    let origin : Origin
}
struct Origin : Decodable {
    let code : String
}

func getBoats() {

let urlString = "http://myApi"
guard let url = URL(string: urlString) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, err) in
        guard let data = data else {return}
        let dataAsString = String(data: data, encoding: .utf8)
        //print(dataAsString)

        do {
            let boats = try
                JSONDecoder().decode(FindBoatResult.self, from: data)

            print(boats)
        } catch {
            print(err) 
        }  
    }.resume()
}

这会失败并抛出 err 但 err 打印为 nil.. 所以我不知道我错过了什么。 dataAsString 按预期打印出 JSON,所以我知道“数据”是好的。

最佳答案

我发现了几个小问题。尝试替换这个:

struct FindBoatResult: Decodable {
    let boats: Boats
    let num_boats: Int
}
struct Boats: Decodable {
    let segments: [Segments]
}

与:

struct FindBoatResult: Decodable {
    let boat: [Boat]
    let num_boats: Int
}
struct Boat: Decodable {
    let segments: [Segments]
}

最后,使用 Result 类型(不是 FindBoatResult)解码:

JSONDecoder().decode(Result.self, from: data)

关于ios - Swift 4 JSON 解码器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46965513/

相关文章:

ruby - 为什么重复的 JSON 解析会消耗越来越多的内存?

jquery - javascript json ajax数据解析

swift - 如何获取结构类型的值?

swift - Realm 方法 addOrUpdateObject() 是否可以从 Swift 调用?

ios - 执行 segue 后,嵌入式导航栏在 iOS 7(小屏幕)上消失,但在 iOS 9(大屏幕)上不消失

ios - Swift 中枚举的默认值

c# - 如何查看 WCF 服务中的 JSON?

objective-c - 如何连接到基类中的 IBOutlet 和 IBAction

ios - 如何禁用 UITabBarController 中的选项卡?

swift - 无法将 '()?' 类型的值转换为指定的 Bool 类型