Как я могу получить отсортированные данные по ключу заказа, используя JSONDecoder? - PullRequest
0 голосов
/ 28 апреля 2018

Я получаю ответ от API и собираюсь проанализировать ответ, используя 'JSONDecoder' и могу проанализировать, но я хочу отсортированный массив 'FieldModel' в соответствии с ключом 'order' в объекте "content" объекта "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 голосов
/ 28 апреля 2018

Вы можете достичь своих целей, создав собственный метод init(from decoder) для своей структуры ContentModel, где вы используете свойство order элементов FieldModel, чтобы назначить FieldModel s на их соответствующие места в 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
}
...