Расшифровка этого вида JSON с Codable - PullRequest
0 голосов
/ 15 октября 2019

У меня есть json, который выглядит следующим образом:

let jsonString = """
{
    "data": [
        {
            "name": "Apple",
            "price": 44,
            "available": true
        },
        {
            "name": "Pear",
            "price": 27,
            "available": false
        }
    ],
    "some_stuff": [],
    "some_other_stuff": []
}"""

Моя цель - проанализировать содержимое массива data, особенно в структуре, которая не заботится о атрибуте availibility,Меня не волнует возвращаемое значение some_stuff и some_other_stuff в том, что json.

  • Первый вопрос: могу ли я проигнорировать событие этих свойств, если они являются частью ответа на том же уровне, что и "данные "которые меня интересуют? Если да, то как мне представить и пустой массив типа, который я игнорирую, потому что я получаю только пустые массивы? (Для этой части я решил представить его как массив произвольно выбранного типа Int?)

Я создал структуру:

struct Fruit: Codable {
    let name: String
    let price: Int
}

И выше вид суперструктуры:

struct WholeResponse: Codable {
    let data: [Fruit]
    let someStuff: [Int?]
    let someOtherStuff: [Int?]

    enum CodingKeys: String, CodingKey {
        case data
        case someStuff = "some_stuff"
        case someOtherStuff = "some_other_stuff"
    }

    struct Fruit: Codable {
        let name: String
        let price: Int
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        let data = try container.nestedContainer(keyedBy: CodingKeys.self, forKey: .data)
        name = try data.decode(String.self, forKey: .name)
        price = try data.decode(Int.self, forKey: .price)
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        var data = container.nestedContainer(keyedBy: CodingKeys.self, forKey: .data)
        try data.encode(name, forKey: .name)
        try data.encode(price, forKey: .price)
    }
}

Но после этого я довольно застрял:

let jsonData = jsonString.data(using: .utf8)!
let jsonDecoder = JSONDecoder()

let fruits = try jsonDecoder.decode(WholeResponse.self, from: jsonData)

Я думаю, что что-то упускаю из-за представления моих данных и, возможно, усложняю ситуацию, но вы можете помочьмне разобрать этот массив данных?

1 Ответ

2 голосов
/ 15 октября 2019

Сначала просто удалите все, что вам не нужно:

struct WholeResponse: Codable {
    let data: [Fruit]

    struct Fruit: Codable {
        let name: String
        let price: Int
    }
}

Затем, аналогично тому, что вы имели раньше, скажем

let response = try jsonDecoder.decode(WholeResponse.self, from: jsonData)
let fruits = response.data
...