【问题标题】:Decode JSON using Swift 4 with Youtube Analytics for nested unkeyed array使用带有 Youtube Analytics 的 Swift 4 解码 JSON 以获取嵌套的无键数组
【发布时间】:2019-02-18 17:07:53
【问题描述】:

所以我在使用 Youtube Analytics 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


    【解决方案1】:
    "rows": [
        [
            6
        ]
    ]
    

    这里的数组里面有一个数组,所以写

    let rows: [[Int]]
    

    而不是

    let rows: [Row]
    

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

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

    "6",因为您尝试将其解码为 String?,而不是 API 为您提供的 Int 6

    您可以像往常一样访问行中的数据:

    response.rows[0][0]
    

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

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

    【讨论】:

    • 感谢您的快速回复。我仍然不确定如何访问该值。如果我使用建议response[0][0],即let value = response[0][0],我返回的“响应”没有下标成员。 @Fabian
    • @JamesFaulkner 错过了 rows 是数组!试试response.rows[0][0]
    • 完美。非常感谢@Fabian
    【解决方案2】:

    您需要具有相同的结构,以便将响应解码为对象,并且作为它的 JSON,它的 [Key:Value] 每个键都是一个字符串,指示值是什么,因此值可以是一个数组或一个数组数组或另一个对象,即使值可以是您的任何情况

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

    第一个索引,(种类:youtubeAnalytics#resultTable)所以它的字符串:字符串值 下一个索引是 (columnHeader: ) 所以它的 String: this object is key: value 也有键名、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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多