gpt4 book ai didi

json - 使用 Swift JSONDecoder 处理 JSON

转载 作者:搜寻专家 更新时间:2023-11-01 06:12:59 25 4
gpt4 key购买 nike

这是我正在尝试解析的 JSON

{
"rows": [
{
"layout": "Y",
},
{
"layout": "A",
}
]
}

我希望能够过滤掉不支持的布局类型。我正在使用 JSONDecoder 将 JSON 数据转换为结构,但我在处理行时遇到问题。我正在尝试使用 let row = try? 转换每一行? rowContainer.decode(Row.self) 但我可以弄清楚如果它失败如何移动到下一个,除非我将它解码为空结构。我尝试将其解码为字典,但除了值字段的 Any 外,它不会。

enum RowType: String, Codable {
case a = "A"
case b = "B"
}

public struct Page: Codable {

let rows: [Row]

public init(from decoder: Decoder) throws {

// Get Container
let container = try decoder.container(keyedBy: CodingKeys.self)

// Create Result Array
var rowResult: [Row] = []

// Get Rows Container
var rowContainer = try container.nestedUnkeyedContainer(forKey: .rows)

// Process Rows
while !rowContainer.isAtEnd {

// Create Row
if let row = try? rowContainer.decode(Row.self) {
rowResult.append(row)
}
else {

// Increment Row Container
_ = try rowContainer.decode(Empty.self)
}
}

// Set Result
rows = rowResult
}

// Used For Unsupported Rows
struct Empty: Codable {}
}

public struct Row: Codable {
let layout: RowType
}

最佳答案

这是一种不同的方法。

布局字符串值创建一个临时结构

public struct RawRow: Codable {
let layout: String
}

Page中,首先将rows解码为RawRow,然后将compactMap数组解码为Row。它过滤所有 layout 值无法转换为枚举的项目

public struct Page: Codable {
let rows: [Row]

public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let rowData = try container.decode([RawRow].self, forKey: .rows)
rows = rowData.compactMap {
guard let rowType = RowType(rawValue: $0.layout) else { return nil }
return Row(layout: rowType)
}
}
}

关于json - 使用 Swift JSONDecoder 处理 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51290784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com