Декодирование этой простой структуры JSON не работает - PullRequest
0 голосов
/ 22 июня 2019

У меня есть простая модель, которую я определил для декодирования структуры. Но это не удается при декодировании. Кто-нибудь может сказать мне, что я делаю неправильно?

struct Model: Codable {
    let firstName: String
    let lastName: String
    let age: Int

    enum Codingkeys: String, CodingKey {
        case firstName = "first_name"
        case lastName = "last_name"
        case age
    }
}


class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        let session = URLSession.shared
        let url = URL(string: "https://learnappmaking.com/ex/users.json")!
        let task = session.dataTask(with: url) { (data, response, error) in
            let decoder = JSONDecoder()
            let d = try! decoder.decode([Model].self, from: data!) //fails here
            print(d)
        }
        task.resume()
    }
}

Я дважды проверил, был ли JSON верен, но он все равно не смог расшифровать.

Отображается ошибка

Тема 5: Неустранимая ошибка: 'попробуй!' Выражение неожиданно вызвало ошибку: Swift.DecodingError.keyNotFound (CodingKeys (stringValue: "firstName", intValue: nil), Swift.DecodingError.Context (codingPath: [_JSONKey (stringValue: «Index 0», intValue: 0)], debugDescription: «Нет значение, связанное с ключом CodingKeys (stringValue: \ "firstName \", intValue: nil) (\ "firstName \"). ", underError: nil))

Он продолжает искать firstName, но у меня специально есть перечисление для проверки на first_name.

Это полезная нагрузка JSON

[
  {
    "first_name": "Ford",
    "last_name": "Prefect",
    "age": 5000
  },
  {
    "first_name": "Zaphod",
    "last_name": "Beeblebrox",
    "age": 999
  },
  {
    "first_name": "Arthur",
    "last_name": "Dent",
    "age": 42
  },
  {
    "first_name": "Trillian",
    "last_name": "Astra",
    "age": 1234
  }
]

Я знаю, что могу добавить decoder.keyDecodingStrategy = .convertFromSnakeCase, но я хочу знать, почему не работает существующий код?

1 Ответ

0 голосов
/ 22 июня 2019

Код правильный, но, видимо, есть проблема с вашей моделью (хотя convertFromSnakeCase работает)

Я перепечатал структуру, и ошибка исчезла. Пожалуйста, скопируйте и вставьте

struct Model : Decodable {
    let firstName : String
    let lastName : String
    let age : Int

    private enum CodingKeys : String, CodingKey { case firstName  = "first_name", lastName  = "last_name", age }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...