如何使用 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) 方法来实现您的目标,您可以在其中使用 FieldModelorder 属性将 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
}