Попытка разобрать json, не могу разобрать массивы внутри массива - PullRequest
1 голос
/ 26 мая 2019

Я пытался проанализировать часть этого файла JSON: https://opendata.brussels.be/api/records/1.0/search/?dataset=traffic-volume&rows=3&facet=level_of_service

Я хочу получить записи-> поля-> geo_shape-> координаты, но я не могу напечатать эти массивы внутримассива "координат" .. Я подумал, что это может быть потому, что массивы внутри координат не имеют имен, поэтому я не знаю, как сделать переменную для них.Получил этот код в настоящее время:

import UIKit
import Foundation


struct Geoshape : Codable {
    let coordinates: Array<...>
}
struct Field : Codable {
    let geo_shape: Geoshape
    let level_of_service: String
}
struct Record: Codable {
    let fields: Field
}

struct Traffic: Codable{
    let records: Array<Record>
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func clickRefresh(_ sender: Any) {
        guard let url = URL(string: "https://opendata.brussels.be/api/records/1.0/search/?dataset=traffic-volume&rows=3&facet=level_of_service") else { return }
        let session = URLSession.shared
        let task = session.dataTask(with: url){ (data, response, error) in
            if let response = response {
                print(response)
            }
         if let data = data {


            let traffic = try? JSONDecoder().decode(Traffic.self, from: data)
            print(traffic)

            }

        }
        task.resume()
    }
}

Ясно, что массив <...> нужно изменить, но я не знаю, на что.Я попытался создать дополнительную структуру только с одной переменной (это другой массив типа Double: Double), но это, похоже, не работает.Я был в состоянии распечатать все очень хорошо до точки, я пытался перейти в массив координат.

Кто-нибудь может мне помочь?

Ответы [ 2 ]

2 голосов
/ 26 мая 2019

Заменить

let coordinates: Array<...>

на

let coordinates:[[Double]]
0 голосов
/ 26 мая 2019

Прежде всего, ваш файл в Ресурс содержит JSON, который содержит массив или Collection (обычно в Swift).

Одна важная вещь: если вам не удалось декодировать объектв JSON вы получаете ноль из всех сохраненных свойств.сбой происходит, когда ваши ключи кодирования не совпадают с ключами в json, или тип, который вы используете, отличается:

В вашем коде вы не смогли преобразовать coordinates в его тип.координаты - это набор коллекций Double.

var coordinates: [[Double]]

. Если вы хотите извлечь данные в свои модели, вы должны согласовать их с протоколом Decodable, что означает, что атрибуты JSON могут декодировать себя.

На основе Apple Developer Документация :

Декодируемый - это тип, который может декодировать себя из внешнего представления.

также Кодируемый протокол относится к Декодируемым и Кодируемым протоколам.но текущая цель - декодирование данных.

typealias Codable = Decodable & Encodable

Ваш код должен выглядеть следующим образом:

Swift 5

Подготовлено для Playground, вставьте его на игровую площадку

import Foundation

struct GeoShape: Decodable {
    var coordinates: [[Double]]
}

struct Field: Decodable {
    var geo_shape: GeoShape
}

struct Record: Decodable {
    var fields: Field
}

struct Traffic: Decodable {
    var records: [Record]
}

guard let url = URL.init(string: "https://opendata.brussels.be/api/records/1.0/search/?dataset=traffic-volume&rows=3&facet=level_of_service")
    else {fatalError()}

URLSession.shared.dataTask(with: url){ (data, response, error) in
    if let data = data {
        let traffic = try? JSONDecoder().decode(Traffic.self, from: data)
        print("First coordinate is: ",traffic?.records.first?.fields.geo_shape.coordinates.first)
    }
    }.resume()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...