Синтаксический анализ JSON с декодируемой ошибкой Swift - PullRequest
0 голосов
/ 27 февраля 2020

Я хочу проанализировать короткий запрос JSON из HTTP-запроса со структурой и декодируемой функцией. Объявление выглядит так:

struct Wert: Codable {
    let age: String
    let first_name: String
}

let session = URLSession.shared
    let url = URL(string: "https://learnappmaking.com/ex/users.json")!

И мой код, чтобы сделать запрос и попытаться разобрать:


            guard let data = data else { return }

            do {
                let preis = try JSONDecoder().decode(Wert.self, from: data)
                print(preis);
            }
                catch {
                    print("JSON error: \(error.localizedDescription)")
                }
        }.resume()

Я получаю сообщение об ошибке: «JSON ошибка: данные не могут не будет прочитано, потому что оно не в правильном формате. " И я не знаю, что не так с кодом

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
  }
]

Было бы неплохо, если бы кто-то мог мне помочь.

Ответы [ 3 ]

3 голосов
/ 27 февраля 2020

Ошибка:

JSON, который вы используете, недействителен. Допустимое значение 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}]

Модель:

Используйте Int в качестве типа данных для age вместо String,

struct Wert: Decodable {
    let firstName, lastName: String
    let age: Int
}

Синтаксический анализ:

1. При синтаксическом анализе используйте [Wert].self вместо Wert.self, т.е.

2. Используйте decoder.keyDecodingStrategy = .convertFromSnakeCase для работы со змеиными (подчеркиванием) клавишами в JSON, т.е.

if let url = URL(string: "https://learnappmaking.com/ex/users.json") {
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        if let data = data {
            do {
                let decoder = JSONDecoder()
                decoder.keyDecodingStrategy = .convertFromSnakeCase
                let preis = try decoder.decode([Wert].self, from: data)
                print(preis)
            } catch {
                print(error)
            }
        }
    }.resume()
}
0 голосов
/ 27 февраля 2020

Возраст не является строковым типом в вашем файле Json, обновите отображение, как показано ниже.

struct Wert: Codable {
    let age: Int
    let first_name: String
}
0 голосов
/ 27 февраля 2020

Требуется предоставить ключи кодирования для пользовательских ключей.

struct Wert: Codable {
    let age: String
    let firstName: String

    enum CodingKeys: String, CodingKey {
        case age, firstName = "first_name"
    }
}
...