arrays - 如何使用在 Swift 4.0 中嵌套数组的数组解析 JSON?

标签 arrays json swift

我正在尝试解析一个 JSON API,其中我正在尝试提取键值“数据”的数字。如您所见,这些数字嵌套在两个数组中,其中第二个数组没有要引用的键值。我该怎么做?

{
  "dataset": {
    "id": 9789340,
    "name": "DCC share price (DCC), Currency GBX",
    "description": "Stock Prices for Dcc Share Price (dcc), Currency Gbx from the London Stock Exchange.<br><br>Currency: GBX",
    "start_date": "2006-03-16",
    "end_date": "2017-11-22",
    "column_names": [
      "Date",
      "Price",
      "High",
      "Low",
      "Volume",
      "Last Close",
      "Change",
      "Var%"
    ],
    "data": [
      [
        "2017-11-22",
        7060.0,
        7185.0,
        7045.0,
        156444.0,
        7060.0,
        -95.0,
        -1.33
      ],
      [
        "2017-11-21",
        7155.0,
        7210.0,
        7130.0,
        189002.0,
        7155.0,
        -30.0,
        -0.42
      ]
    ]
  }
}

到目前为止,我已经完成了。

struct Dataset: Decodable {
    let name: String
    let description: String
    let column_names: [ColumnNames]
    let data: [StockData]
}

struct ColumnNames: Decodable {
    // What happens here??
}

struct StockData: Decodable {
    // What happens here??
}

guard let url = URL(string : jsonUrlString) else { return }

URLSession.shared.dataTask(with: url) { (data, response, err) in

    guard let jsonData = data else {
        return
    }

    do {
        let dataSet = try JSONDecoder().decode(Dataset.self, from: jsonData)
        let dataArray = dataset.data
        dump(dataArray)
        for stockDataArray in dataArray {
            for stockItems in stockDataArray
            dump(stockItems)
        }
    }
}

如您所见,我不知道如何解码“StockData”,因为 JSON 数据是数组的数组。如果我对此有答案,那么希望我能够解决应该解析的“ColumnNames”。它也不是具有要解析的键值的字典。

最佳答案

这是一个利用JSONDecoder强大定制能力的解决方案

它创建合并 column_namesdata 数组的字典。

这是你的 JSON

let jsonString = """
{
    "dataset": {
        "id": 9789340,
        "name": "DCC share price (DCC), Currency GBX",
        "description": "Stock Prices for Dcc Share Price (dcc), Currency Gbx from the London Stock Exchange.<br><br>Currency: GBX",
        "start_date": "2006-03-16",
        "end_date": "2017-11-22",
        "column_names": ["Date", "Price", "High", "Low", "Volume", "Last Close", "Change", "Var%"],
        "data": [["2017-11-22", 7060.0, 7185.0, 7045.0, 156444.0, 7060.0, -95.0, -1.33],
            ["2017-11-21", 7155.0, 7210.0, 7130.0, 189002.0, 7155.0, -30.0, -0.42]]
    }
}
"""

和两个结构,一个用于根对象,一个用于Dataset,在这个例子中只有idname被解码,data 将包含合并后的字典数组

struct Root : Decodable {
    let dataset : Dataset
}

struct Dataset : Decodable {

    private enum CodingKeys : String, CodingKey {
        case id, name, columnNames = "column_names", data
    }

    let id : Int
    let name : String

    var data = [[String:Any]]()

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        id = try container.decode(Int.self, forKey: .id)
        name = try container.decode(String.self, forKey: .name)
        let columnNames = try container.decode([String].self, forKey: .columnNames)

        var outerContainer = try container.nestedUnkeyedContainer(forKey: .data)
        while !outerContainer.isAtEnd {
            var columnIndex = 0
            var dataSet = [String:Any]()
            var innerContainer = try outerContainer.nestedUnkeyedContainer()
            let date = try innerContainer.decode(String.self)
            var key = columnNames[columnIndex]
            dataSet[key] = date
            columnIndex += 1
            while !innerContainer.isAtEnd {
                let value = try innerContainer.decode(Double.self)
                key = columnNames[columnIndex]
                dataSet[key] = value
                columnIndex += 1
            }
            data.append(dataSet)
        }

    }
}

现在解码这些东西

let data = Data(jsonString.utf8)
do {
    let decoder = JSONDecoder()
    let root = try decoder.decode(Root.self, from: data)
    print(root.dataset)
} catch {
    print("error: ", error)
}

关于arrays - 如何使用在 Swift 4.0 中嵌套数组的数组解析 JSON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47500985/

相关文章:

python mailchimp api 2.0 json响应错误

ios - 如何从 XCTestCase(UI 测试用例)调用应用程序代码中的方法

php - stdClass 对象和数组如何使用 php

python - 如何在 PySMT 中使用数组?

java - 如何在 Java 中合并 2 个字符串数组,但保留重复项?

php - 如何显示mysql Json数据

json - Swift 从 JSON 请求生成通用函数

ios - Swift4 将特定字符串转换为特定 Int

ios - 以编程方式使用大小类设置字体大小

php在数组上循环以计算数据库中的条目