Как разобрать JSON, начиная с безымянного массива? - PullRequest
0 голосов
/ 05 мая 2020

Я новичок в синтаксическом анализе (и кодировании)

Это мой JSON:

[
  {
    "id": "BTC",
    "currency": "BTC",
    "symbol": "BTC",
    "name": "Bitcoin",
    "logo_url": "https://s3.us-east-2.amazonaws.com/nomics-api/static/images/currencies/btc.svg",
    "rank": "1",
    "price": "8890.83451549",
    "price_date": "2020-05-05T00:00:00Z",
    "price_timestamp": "2020-05-05T17:07:00Z",
    "market_cap": "163265390419"
  }
]

Я пытаюсь удержать свойство price со следующим:

struct GetPriceArray: Codable {
    let getPriceArray: [GetPrice]
}

struct GetPrice: Codable {
    let price: String
}

Проблема в том, что путь JSON равен 0.price (на что указывает JSON Viewer Awesome), и с указанным выше невозможно получить это 0.

Я уже пробовал прыгать прямо на .price, но это не работает.

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Удалить

struct GetPriceArray: Codable {
    let getPriceArray: [GetPrice]
}

и декодировать массив

let result = JSONDecoder().decode([GetPrice].self, from: ...

Получите цену с

result.first?.price
0 голосов
/ 06 мая 2020

Если хотите GetPriceArray работа с декодером и без ключа JSON.

struct GetPriceArray: Codable {
    let list: [GetPrice]
    init(from decoder: Decoder) throws {
        var container = try decoder.unkeyedContainer()
        var elements: [GetPrice] = []
        elements.reserveCapacity(container.count ?? 0)
        while !container.isAtEnd {
            if let element = try? container.decode(GetPrice.self) {
                elements.append(element)
            }
        }
        self.list = elements
    }
}

Тест.

guard let jsonData = jsonString.data(using: .utf8),
    let getPriceArray = try? JSONDecoder().decode(GetPriceArray.self, from: jsonData) else {
        return
}
for i in getPriceArray.list {
    print(i.price)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...