Ошибка при разборе JSON с использованием URLSession в swift - PullRequest
0 голосов
/ 13 января 2020

Я пытаюсь проанализировать тест JSON с адреса http, но я получаю сообщение об ошибке, сообщающее, что

"Нет значения, связанного с ключом CodingKeys (stringValue: \" name \ ", intValue: nil)

JSON выглядит следующим образом. Оно было проверено, поэтому должно работать нормально:

{
  "work": [
    {
      "name": "Jocke",
      "job": "Developer",
      "date": "1985-12-30T00:00:00+0000",
      "best_book": {
        "id": 33245,
        "title": "DiscWorld",
        "author": {
          "id": 345,
          "name": "Terry Prattchet"
        }
      }
    },
    {
      "name": "Bob",
      "job": "Construction worker",
      "date": "2010-01-30T00:00:00+0000",
      "best_book": {
        "id": 375802,
        "title": "Ender's Game (Ender's Saga, #1)",
        "author": {
          "id": 589,
          "name": "Orson Scott Card"
        }
      }
    }
  ]
}

Код выглядит следующим образом:


struct People: Codable {
    let name: String
    let job: String

    enum OuterKey: String, CodingKey {
        case work = "work"
    }

    enum codingKeys: String, CodingKey {
        case name = "name"
        case job = "job"
    }

    init(decoder: Decoder) throws {
        let outerContainer = try decoder.container(keyedBy: OuterKey.self)
        let innerContainer = try outerContainer.nestedContainer(keyedBy: CodingKeys.self, forKey: .work)
        self.name = try innerContainer.decode(String.self, forKey: .name)
        self.job = try innerContainer.decode(String.self, forKey: .job)
    }

}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        guard let url = URL(string: "https://api.myjson.com/bins/fe2eo") else { return }

        URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard let data = data else { return }

            do {
                let jsonDecoder = JSONDecoder()
                jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase

                let decodedJson = try! jsonDecoder.decode([People].self, from: data)
            }
        }.resume()
    }
}

Я просто пытаюсь набрать asp первые два keys на данный момент, просто чтобы посмотреть, работает ли оно. Но оно даже не прошло name.

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Ваш API возвращает

[{"firstName": "Jocke", "job": "developer"}, {"firstName": "Anna", "job": "construction" }, {"firstName": "Peter", "job": "pilot"}]


        do {
            let jsonDecoder = JSONDecoder()
            let decodedJson = try jsonDecoder.decode([People].self, from: data)
           }
         catch {
            print(error)
         }


struct People: Codable {
    let firstName, job: String
}
1 голос
/ 13 января 2020

просто попробуйте это

struct Work:Codeable {
  let work:[People]
}

struct People: Codable {
    let name: String
     let job: String
    }

     do {
          let jsonDecoder = JSONDecoder()
          let decodedJson = try jsonDecoder.decode(Work.self, from: data)
         }
   catch {
           print(error)
          }

, если у вас такое же имя, как у json ключей, которые вам не нужно использовать codingkeys

...