如何解析數組的JSON數組並通過名稱引用內部數組的成員?

亞歷山大·法伯

Swift Playground 中,我嘗試解析以下數據:

let jsonMoves:String =

"""
{ "moves":
    [
        [0, 'CAT (7)', 'ACT'],
        [1, 'EXTRA (14)', 'ERXT'],
        [0, 'TOP (22)', 'PO'],
        [1, 'TOY (9)', 'Y']
    ]
 }
"""

為此,我創建了 2 個結構:

struct MovesResponse: Codable {
    let moves: [[MoveModel]]
}

struct MoveModel: Codable {
    let mine: Int
    let words: String
    let letters: String
}

和電話:

let decoder = JSONDecoder()

if let movesData = jsonMoves.data(using: .utf8),
   let movesModel = try? decoder.decode(MovesResponse.self, from: movesData),
   movesModel.count > 0 // does not compile
{
    print("Parsed moves: ", movesModel)
} else {
    print("Can not parse moves")
}

不幸的是,上面的代碼給了我編譯錯誤:

“MovesResponse”類型的值沒有成員“count”

當我刪除該行並更改try?totry!以查看異常時,我收到錯誤消息:

致命錯誤:“嘗試!” 表達式意外引發錯誤:Swift.DecodingError.dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.",underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value在第 3 行,第 12 列周圍。” UserInfo={NSDebugDescription=第 3 行,第 12 列周圍的值無效。,NSJSONSerializationErrorIndex=29})))

作為 Swift 新手,我認為結構MoveModel是錯誤的。請幫忙。

另外我想知道是否可以將內部數組的三個元素稱為“我的”、“單詞”、“字母”?

更新:

我已jsonMoves按照 Joakim 的建議將單引號更改為雙引號(謝謝​​!),現在錯誤是:

致命錯誤:“嘗試!” 表達式意外引發錯誤:Swift.DecodingError.typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "moves", intValue: nil), _JSONKey(stringValue: "索引 0", intValue: 0), _JSONKey(stringValue: "Index 0", intValue: 0)], debugDescription: "預期解碼 Dictionary<String, Any> 但找到了一個數字。",underlyingError: nil))

喬金·丹尼爾森

您可以使用您的MoveModel但由於每個內部數組代表一個實例,MoveModel您需要將第一個結構更改為

struct MovesResponse: Codable {
    let moves: [MoveModel]
}

然後你需要一個自定義init(from:)MoveModelMoveModel使用無鍵容器而不是編碼鍵將每個數組解碼為一個對象。

init(from decoder: Decoder) throws {
    var container = try decoder.unkeyedContainer()
    mine = try container.decode(Int.self)
    words = try container.decode(String.self)
    letters = try container.decode(String.self)
}

與其使用try?和打印硬編碼消息,我建議您捕獲錯誤並打印它

let decoder = JSONDecoder()
do {
  let movesModel = try decoder.decode(MovesResponse.self, from: data)
    print(movesModel)
} catch {
    print(error)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何重命名Node Js中數組內部對象的“鍵”名稱?

使用 for 循環和函數內部的格式按名稱將項目附加到數組

如何通過另一個數組編號鍵過濾數組鍵

const int,成員數組大小

如何過濾數組?

java - 如何通過更改數組y的值將數組x更改為數組y的值?

如何在 JSON 響應中在數組對象本身的數組之前添加名稱?

使用循環通過數組將嵌套在內部的鍵值推送到不同的數組中。Javascript

如何使用 GSON 反序列化數組內部的 Double 數組?

如何通過另一個數組屬性組合和過濾數組屬性

如何解析包含多種數據類型的json數組?

如何通過二維數組索引使用?

如何通過放入 scanf 的數字數量來定義數組的限制?

如何通過 GORM 查詢並僅返回 id 數組?

為什麼在沒有 ref 的情況下傳遞數組,在方法內部通過 CopyTo 更改?

如何遍歷對像數組並使用 Lodash 查找出現的次數和元素名稱

如何在php中打印json數組內的數組值

組合數組內的所有數組

郵遞員讀取json響應中的屬性,名稱保存在數組中

如何創建與不同對象耦合的成員函數指針數組?

初始化二維字符串動態數組並通過引用傳遞

如何將數組合併為 JSON 數組

通過匹配 id 屬性過濾數組

如何呈現由數組映射給出的名稱的組件?

過濾嵌套數組並返回具有過濾值的整個數組

我如何通過嵌套對像數組創建具有嵌套對像數組的對象

如何通過在每個數組的末尾放置一個來連接兩個數組?

如何通過在包含與字段匹配的數組的對象的數組上運行一次來創建 2 個數組?

如何為數組中嵌套數組的每個元素分配列標籤/名稱?