使用Swift 4和Youtube Analytics对嵌套的非键控数组解码JSON

问题描述 投票:1回答:2

因此,在使用Youtube Analytics API时,我遇到了一些问题,该API会返回如下所示的JSON:

{
 "kind": "youtubeAnalytics#resultTable",
 "columnHeaders": [
  {
   "name": "views",
   "columnType": "METRIC",
   "dataType": "INTEGER"
  }
 ],
 "rows": [
  [
   6
  ]
 ]
}

我需要访问值6?

我创建的用于访问此值的结构似乎不起作用,我认为它与访问未键控的数组有关。

struct Response: Decodable {
    let rows: [Row]?
}

struct Row: Decodable {
    let value: String?

    init(from decoder: Decoder) throws {
        var container = try decoder.unkeyedContainer()
        value = try container.decodeIfPresent(String.self)
    }
}

然后访问该值:

let jsonReturn = try JSONDecoder().decode(Response.self, from: data)
let row = jsonResult.rows![0]
let value = row.value

但是,我不确定即使访问该值也是正确的。

json swift youtube-api decode youtube-data-api
2个回答
1
投票
"rows": [
    [
        6
    ]
]

你在这里有一个数组,所以写

let rows: [[Int]]

代替

let rows: [Row]

因为类需要字典,因为类具有用于引用值的名称。它应该是正确的:

"rows": [
    {
        "value": "6"
    {
]

"6",因为你试图将它解码为String?,而不是api给你Int6

您可以照常访问行中的数据:

response.rows[0][0]

有关访问阵列的更多方法,您可以通过 https://docs.swift.org/swift-book/LanguageGuide/CollectionTypes.html

提示:您可以使用app.quicktype.io立即获取给定json的结构。


0
投票

你需要有相同的Struct,以便将响应解码为Object,并且作为它的JSON,它的[Key:Value]每个Key都是一个String,它指示Value是什么,所以Value可以是一个数组或一个数组数组或其他对象,即使值可以是您的情况

{
 "kind": "youtubeAnalytics#resultTable",
 "columnHeaders": [
  {
   "name": "views",
   "columnType": "METRIC",
   "dataType": "INTEGER"
  }
 ],
 "rows": [
  [
   6
  ]
 ]
}

第一个索引,(种类:youtubeAnalytics#resultTable)所以它的String:String值下一个索引是(columnHeader :)所以它的String:这个对象是键:值也是,那个键名,columnType,DataType所以最后的值是怎么样的解码这个特殊的响应很简单,如下面的代码,它会让你知道如何在未来考虑JSON和解码

    struct ColumnHeader: Codable {
    var name: String?
    var columnType: String?
    var dataType: String?
}
struct response: Codable {
    var kind: String?
    var columnHeaders: [ColumnHeader?]
    var rows: [[Int]?]
}
// after we have the data and decode it you can access the object easily as the following,
let obj = ColumnHeader(name: "test", columnType: "test", dataType: "test")
let resp = response(kind: "test2", columnHeaders: [obj], rows: [[2,4],[4,5]])

resp.kind
resp.columnHeaders[0]?.name
© www.soinside.com 2019 - 2024. All rights reserved.