因此,在使用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
但是,我不确定即使访问该值也是正确的。
"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的结构。
你需要有相同的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