【问题标题】:JSONDecoder with no output in Swift PlaygroundSwift Playground 中没有输出的 JSONDecoder
【发布时间】:2019-03-17 21:11:26
【问题描述】:

我是SwiftJSON的新手,所以我在Swift Playgrounds练习。我很确定这将被视为解码嵌套的JSON 密钥。但就像我说的,我是新手,并不熟悉所有的技术术语。

无论如何,我认为这段代码是正确的,但由于某种原因它不会打印。而且它没有向我显示任何错误,这使得修复变得更加困难。但是,我一定做错了什么。

import UIKit

let jsonData :Data = """
{
"id": 1,
"name": "John Smith",
"username": "Johnny",
"email": "Johnny@yahoo.com",
"address": {
    "street": "Some Street",
    "suite": "100",
    "city": "SomeCity",
    "zipcode": "12345",
    }
}

""".data(using: .utf8)!

struct User :Decodable {

    let id :Int
    let name :String
    let userName :String
    let email :String

    let street :String
    let suite :String
    let city :String
    let zipCode :String

    private enum UserKeys :String, CodingKey {
        case id
        case name
        case userName
        case email
        case address
    }

    private enum AddressKeys :String, CodingKey {

        case street
        case suite
        case city
        case zipCode

    }

    init(from decoder :Decoder) throws {

        let userContainer = try decoder.container(keyedBy: UserKeys.self)

        self.id = try userContainer.decode(Int.self, forKey: .id)
        self.name = try userContainer.decode(String.self, forKey: .name)
        self.userName = try userContainer.decode(String.self, forKey: .userName)
        self.email = try userContainer.decode(String.self, forKey: .email)

        let addressContainer = try userContainer.nestedContainer(keyedBy: AddressKeys.self, forKey: .address)

        self.street = try addressContainer.decode(String.self, forKey: .street)
        self.suite = try addressContainer.decode(String.self, forKey: .suite)
        self.city = try addressContainer.decode(String.self, forKey: .city)
        self.zipCode = try addressContainer.decode(String.self, forKey: .zipCode)

    }

}

if let user = try? JSONDecoder().decode(User.self, from: jsonData) {
    print(user.name)
    print(user.city)
}

【问题讨论】:

  • 为什么不使用try/catch 并打印错误?这可能有助于隔离问题。
  • 这是@Martin R 提出的一个绝妙想法,用于隔离Xcode 未明确呈现给程序员的代码问题。
  • 游乐场已经这样做了。只需去掉 if let user = try? 并将其替换为 let user = try。它会抛出一个错误,并且该错误将显示在控制台中。无需捕捉或打印。 (Xcode 过去不这样做,但现在有一段时间了。)

标签: json swift swift-playground jsondecoder


【解决方案1】:

userNamezipCode 属性是驼峰式的,因为它们应该遵循 Swift 标准。然而,正如JSON 数据经常发生的那样,"username""zipcode" 键都以小写形式显示。幸运的是,有一个简单的解决方法。在您的private enums 中,只需将两个properties 设置为它们的小写stringValue,如下所示:

 case userName = "username"
 case zipCode = "zipcode"

从技术上讲,我认为您处理的是nested dictionaryJSON properties。不过我不确定,也许这个网站上的一些专家可以详细说明一下。

【讨论】:

  • 这行得通。现在它可以正确打印了。所以,我想我只需要设置这两个属性,因为它们是唯一不匹配小写 JSON 的?
猜你喜欢
  • 1970-01-01
  • 2023-04-11
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多