Swift: данные не могут быть прочитаны, потому что они не в правильном формате - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь вызвать POST Api с помощью Alamofire, но он показывает ошибку неправильного формата.

Это мой ответ JSON:

[
  {
    "_source": {
      "nome": "LOTERIAS BELEM",
      "endereco": "R DO COMERCIO, 279",
      "uf": "AL",
      "cidade": "BELEM",
      "bairro": "CENTRO"
    },
    "_id": "010177175"
  },
  {
    "_source": {
      "nome": "Bel Loterias"
    },
    "_id": "80224903"
  },
  {
    "_source": {
      "nome": "BELLEZA LOTERIAS",
      "endereco": "R RIVADAVIA CORREA, 498",
      "uf": "RS",
      "cidade": "SANTANA DO LIVRAMENTO",
      "bairro": "CENTRO"
    },
    "_id": "180124986"
  }
]

class Album: Codable {
    var _source :  [_source]

}

class _source: Codable {
    var nome :  String
    var endereco : String
    var uf : String
    var cidade : String
    var bairro : String
}

var arrList = [Album]()

ИВот как я пытаюсь декодировать с Alamofire.

func request() {

        let urlString = URL(string: "My Url")
      //  Alamofire.request(url!).responseJSON {(response) in

        Alamofire.request(urlString!, method: .post, parameters: ["name": "belem"],encoding: JSONEncoding.default, headers: nil).responseJSON {
            (response) in

            switch (response.result) {
            case .success:
                if let data = response.data {
                    do {
                        let response = try JSONDecoder().decode([Album].self, from: data)
                        DispatchQueue.main.async {
                             self.arrList = response
                        }
                    }
                    catch {
                        print(error.localizedDescription)
                    }
                }
            case .failure( let error):
                print(error)
            }
       }
 }

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Только ваша модель Album неверна.

struct Album: Codable {
    var source : Source
    var id     : String

    enum CodingKeys: String, CodingKey {
        case source = "_source"
        case id = "_id"
    }
}

struct Source: Codable {
    var nome     : String
    var endereco : String?
    var uf       : String?
    var cidade   : String?
    var bairro   : String?
}

Если вы вообще не хотите _id, просто удалите соответствующие детали.
Что касается кода, связанного с Alamofire,эта часть хороша.


Заметные улучшения:

  • Избегали подчеркивания имени переменной в модели, настроив CodingKeys для сопоставления клавиш
  • Typenamesвсегда начинайте с заглавной буквы (поэтому _source равно Source)
    • Аналогично, имена переменных всегда должны начинаться со строчной буквы
  • Делать некоторые переменные необязательными (на основе вашего обновленного ответа)
    • Сохранение переменной необязательным означает, что должно присутствовать в ответе для создаваемой модели
    • Если сделать переменную необязательной, это означает, чтоключ может присутствовать или отсутствовать в ответе, и его отсутствие не будет препятствовать созданию модели
0 голосов
/ 07 марта 2019

Я бы рекомендовал вам использовать json4swift.com. Вы просто должны скопировать свой JSON и вставить туда. Он автоматически создаст модальную структуру или класс из вашего json.

Возвращаясь к вашему вопросу, у вашего класса Album нет массива [_source]. Вот почему вы получаете следующее сообщение об ошибке: «Данные не могут быть прочитаны, потому что они не в правильном формате».

Попробуйте ниже приведенный формат класса альбома,

class Album: Codable
{ 
  var source: Source?
  var id: String?
}

Пожалуйста, старайтесь не использовать подчеркивание в Swift.

...