如何使用 JSONDecoder 根据顺序键获取排序数据?
How can i get sorted data according to order key using JSONDecoder?
我正在从 API 获得响应并打算使用 'JSONDecoder' 解析响应并能够解析,但我想要根据 'order' 排序的 'FieldModel' 数组当我使用 JSONDecoder 解码时,键入 "ContentModel" auto 的 "content" 对象?
My response from API:
{content = (
{
fieldName = \"$.alcohol.beer\";
label = Beer;
order = 2;
},
{
fieldName = \"$.alcohol.wine\";
label = Wine;
order = 1;
},
{
fieldName = \"$.alcohol.any\”;
label = Wine;
order = 3;
}
);}
My models:
struct ContentModel: Codable {
var content: [FieldModel]?
}
struct FieldModel: Codable {
var fieldName: String?
var order: Int?
var label: String?
}
Code for decode the data:
let myFinalData = try JSONDecoder().decode(ContentModel.self, from: jsonData)
如何使用上面的代码解码后 ContentModel 的内容将根据顺序键排序?
您可以通过为 ContentModel
结构创建自定义 init(from decoder)
方法来实现您的目标,您可以在其中使用 FieldModel
的 order
属性将 FieldModel
分配给 content
数组中它们各自位置的元素。
我还建议将结构的所有字段设为不可变且非可选,除非您有充分的理由不这样做。
struct ContentModel: Codable {
let content: [FieldModel]
private enum CodingKeys: String, CodingKey {
case content
}
init(from decoder:Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let content = try container.decode([FieldModel].self, forKey: .content)
var orderedContent = content
for element in content {
orderedContent[element.order-1] = element
}
self.content = orderedContent
}
}
struct FieldModel: Codable {
let fieldName: String
let label: String
let order: Int
}
我正在从 API 获得响应并打算使用 'JSONDecoder' 解析响应并能够解析,但我想要根据 'order' 排序的 'FieldModel' 数组当我使用 JSONDecoder 解码时,键入 "ContentModel" auto 的 "content" 对象?
My response from API:
{content = (
{
fieldName = \"$.alcohol.beer\";
label = Beer;
order = 2;
},
{
fieldName = \"$.alcohol.wine\";
label = Wine;
order = 1;
},
{
fieldName = \"$.alcohol.any\”;
label = Wine;
order = 3;
}
);}
My models:
struct ContentModel: Codable {
var content: [FieldModel]?
}
struct FieldModel: Codable {
var fieldName: String?
var order: Int?
var label: String?
}
Code for decode the data:
let myFinalData = try JSONDecoder().decode(ContentModel.self, from: jsonData)
如何使用上面的代码解码后 ContentModel 的内容将根据顺序键排序?
您可以通过为 ContentModel
结构创建自定义 init(from decoder)
方法来实现您的目标,您可以在其中使用 FieldModel
的 order
属性将 FieldModel
分配给 content
数组中它们各自位置的元素。
我还建议将结构的所有字段设为不可变且非可选,除非您有充分的理由不这样做。
struct ContentModel: Codable {
let content: [FieldModel]
private enum CodingKeys: String, CodingKey {
case content
}
init(from decoder:Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
let content = try container.decode([FieldModel].self, forKey: .content)
var orderedContent = content
for element in content {
orderedContent[element.order-1] = element
}
self.content = orderedContent
}
}
struct FieldModel: Codable {
let fieldName: String
let label: String
let order: Int
}