swift - 如何使用 JSONDecoder 根据顺序键获取排序数据?

标签 swift swift4 codable

我正在从 API 获取响应,并将使用“JSONDecoder”解析响应并能够解析,但我想要根据“ContentModel”自动的“content”对象中的“order”键排序“FieldModel”数组我使用 JSONDecoder 进行解码?

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(来自解码器) 方法(在其中使用 order 属性)来实现您的目标FieldModel 元素,将 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
}

关于swift - 如何使用 JSONDecoder 根据顺序键获取排序数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50076639/

相关文章:

ios - 停止 UI 警报 Controller 返回到上一个 View

ios - 类没有初始化程序

ios - CollectionView 内的按钮不可点击

ios - 如何在 Swift 4 可编码协议(protocol)中使用 JSON 字典类型对属性进行编码

ios - 细化 Swift API GET 函数

ios - 在异步图像加载到 UITableViewCell 后滚动时,Swift 图像更改为错误的图像

ios - swift4:无法将值从当前弹出窗口传递到上一个 View Controller

swift - 使用 Swift 4 Codable PropertyListDecoder() 解码 PropertyList

ios - 如何在 iOS Swift 中使用 alamofire 获取 json 响应?

ios - 如何以编程方式创建带有动态选项卡的选项卡栏?底部黑屏问题