Ошибка синтаксического анализа JSON, если он содержит массив - PullRequest
0 голосов
/ 06 октября 2018

Я анализирую URL, который возвращает данные в формате массива, как показано ниже:

[
{"_id":"5bb8b6038fb09210e09fd5c6","name":"John","city":"Dallas","country":"USA","__v":0},{"_id":"5bb8b6258fb09210e09fd5c7","name":"Robert","city":"SFO","country":"USA","__v":0}
]

Я написал класс модели, как показано ниже:

class Peoples: Codable{
    let peoples:[People]
    init(peoples:[People]) {
        self.peoples = peoples
    }
}

class People: Codable{
    var _id : String
    var name : String
    var city : String
    var country : String
    var __v : Int

    init(
        _id : String,
        name : String,
        city : String,
        country : String,
        __v : Int
    )
    {
        self._id = _id
        self.name = name
        self.city = city
        self.country = country
        self.__v = __v

    }
}

И я анализирую данные JSONиспользуя JSONDecoder.

class HomeTabController: UIViewController ,UITableViewDataSource,UITableViewDelegate {
    private var varPeoples= [People]()

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let url = URL(string: “<SomeURL>“)else {return}
        guard  let downloadURL = url else { return }

        URLSession.shared.dataTask(with: downloadURL) { data, urlResponse, error in
            guard let data = data, error == nil, urlResponse != nil
               else
               {
                print( "Something is wrong in URL")
                return;
               }
            print(data)
            do{
                let pplList=  JSONDecoder().decode(Peoples.self, from: data). // This line is giving data incorrect format error.
                self.varPeoples = pplList.peoples

                DispatchQueue.main.async{
                    self.tableView.reloadData()
                }
            }catch{
                print( error.localizedDescription)
            }
     }
}

Если данные JSON не имеют массива [], я могу их проанализировать.Но мой URL возвращает данные с символом array [].Так что любой может исправить код.

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Ошибка возникает из-за того, что если корневой объект является массивом, реализующим зонтичную структуру, это нарушит процесс декодирования.

Просто декодируйте массив.

Некоторые общие замечания Decoding:

  • Если в большинстве случаев JSON доступен только для чтения, то astruct достаточно.
  • Если JSON доступен только для чтения, то соответствует Decodable.
  • Если JSON только для чтения, объявите члены структуры как константы (let).
  • Настоятельно рекомендуется добавить CodingKeys для преобразования странных ключей в (более описательные) имена, соответствующие соглашению об именах Swift.
  • У вас нетчтобы написать инициализатор, даже если объект является классом, Decodable предоставляет его.
  • Чтобы избежать единственного-множественного числа путаницы с именем struct в единственном числе (Person) имассив во множественном числе (people).Семантически каждый объект в people представляет один Person.
  • Никогда print error.localizedDescription при обнаружении ошибки Decoding.localizedDescription возвращает общую строку, но не фактическое описание ошибки.Печатайте всегда весь error экземпляр.

struct Person: Decodable {

    private enum CodingKeys: String, CodingKey { case id = "_id", name, city, country, somethingMoreDescriptiveThan__v = "__v"}

    let id : String
    let name : String
    let city : String
    let country : String
    let somethingMoreDescriptiveThan__v : Int
}

...

private var people = [Person]()

...

do {
   self.people = JSONDecoder().decode([Person].self, from: data)
   DispatchQueue.main.async{
      self.tableView.reloadData()
   }
} catch {
   print(error)
}
0 голосов
/ 06 октября 2018

JSON - это массив People, а не Peoples:

do {
    let pplList =  try JSONDecoder().decode([People].self, from: data) // This line is giving data incorrect format error.
    print("pplList =", pplList)
} catch {
    print( error.localizedDescription)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...