如何使用JSONDecoder根据订单键获取排序数据?

时间:2018-04-28 12:40:55

标签: swift swift4 codable

我从API获得响应并使用' JSONDecoder'来解析响应并且能够解析,但我想要排序的' FieldModel'根据'命令'键入"内容" " ContentModel"的对象我使用JSONDecoder解码时自动?

  

我对API的回应:

{content = (
    {
        fieldName = \"$.alcohol.beer\";
        label = Beer;
        order = 2;
    },
                {
        fieldName = \"$.alcohol.wine\";
        label = Wine;
        order = 1;
    },
       {
        fieldName = \"$.alcohol.any\”;
        label = Wine;
        order = 3;
    }
);}
  

我的模特:

struct ContentModel: Codable {
    var content: [FieldModel]?
}

struct FieldModel: Codable {
    var fieldName: String?
    var order: Int?
    var label: String?
}
  

解码数据的代码:

 let myFinalData = try JSONDecoder().decode(ContentModel.self, from: jsonData)

如何在使用上述代码解码后,按照订单键对ContentModel的内容进行排序?

1 个答案:

答案 0 :(得分:2)

您可以通过为init(from decoder)结构创建自定义ContentModel方法来实现目标,您可以使用order元素的FieldModel属性来指定FieldModel结构1}}到各自在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
}