JSONDecoder без вывода в Swift Playground - PullRequest
0 голосов
/ 18 марта 2019

Я новичок в Swift JSON, поэтому я практикую в 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)
}

1 Ответ

0 голосов
/ 18 марта 2019

Свойства userName и zipCode имеют верблюжий корпус, так как они должны соответствовать Swift стандартам. Однако, как часто бывает с JSON данными, клавиши "username" и "zipcode" представлены в нижнем регистре. К счастью, это легко исправить. В вашем private enums просто установите оба из properties в нижний регистр stringValue, например:

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

Технически, я думаю, что вы имеете дело с nested dictionary из JSON properties. Хотя я не уверен, может быть, некоторые эксперты на этом сайте могут подробнее рассказать об этом.

...