尝试解析json,似乎无法解析数组内部的数组

时间:2019-05-26 16:14:38

标签: json swift

我一直在尝试解析此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()
    }
}

很显然,数组<...>需要更改,但是我不知道要做什么。我试过只用1个变量(这是Double:Double类型的另一个数组)制作一个额外的结构,但这似乎不起作用。我可以打印一切,直到尝试插入坐标数组为止。

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

替换

let coordinates: Array<...>

使用

let coordinates:[[Double]]

答案 1 :(得分:-2)

首先,您在Resource中的文件包含一个JSON,该JSON包含一个数组或Collection(通常在Swift中)。

如果要将数据提取到模型中,则应使它们符合Decodable协议,这意味着JSON属性可以自行解码。

基于 Apple开发者 documentation

  

可解码类型是可以从外部表示形式进行解码的类型。

也可编码协议是指可解码和可编码协议。但是目前的目的是解码数据。

typealias Codable = Decodable & Encodable

您的代码应类似于:

雨燕5

为操场做准备,将其粘贴到操场上

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()