Разобрать произвольный JSON в Swift 4.1

Я хочу разобрать JSON с помощью Swift 4.1

Я знаю, что на первый взгляд это может показаться похожим.

Теперь Swift 4.1 и Codable дают нам отличный инструмент.

Однако как мне его использовать/разобрать - когда я не знаю структуру???

Допустим, мой JSON может быть

{ "foo" : "bar" }

а также

{ "foo" : { "baz" : "bar" }}

Или даже так просто, как

{ "foo" : 1 }

Тогда я не могу использовать Codable, верно? Или я совсем не так понял?

Как тогда разобрать??


person bnassler    schedule 24.04.2018    source источник
comment
Это реальная ситуация?   -  person matt    schedule 24.04.2018
comment
Да. Я хочу использовать данные из API, который дает мне это. На самом деле он будет вкладываться только, скажем, в 10 уровней, но все же... Я пытаюсь найти достаточно элегантное решение, но не могу...   -  person bnassler    schedule 24.04.2018
comment
Итак, вы можете просто проверить: можем ли мы декодировать как строку? Нет? Можем ли мы декодировать как Int? И т. д. или определить декодируемый тип StringOrIntOrWhatever.   -  person matt    schedule 24.04.2018
comment
Codable предназначен для типобезопасных API. Его задача — десериализовать json в объекты Swift. Поскольку ответы вашего сервера абсолютно случайны, вам следует выбрать ответ Эшли Миллс.   -  person heyfrank    schedule 24.04.2018
comment
См. stackoverflow.com/questions/47603630/ Например. Поищите, это уже обсуждалось.   -  person matt    schedule 24.04.2018
comment
Я (более 5 минут, обещаю...) не нашел, но это было то, что я искал. Это все еще не очень хорошо, но я покупаю тип безопасности.   -  person bnassler    schedule 24.04.2018


Ответы (1)


Похоже, вы хотите превратить свои данные JSON в словари и массивы — в этом случае…

do {
    if let dict = try JSONSerialization.jsonObject(with: data) as? [String: Any] {
       // Do something with your dict
    }
} catch {
    print("Error deserializing: \(error)")
}
person Ashley Mills    schedule 24.04.2018
comment
Но словари не соответствуют Codable. Хуже того, его до сих пор не разобрали... Только Any - person bnassler; 24.04.2018
comment
Тип объекта должен быть Any, как вы говорите, вы …не знаете структуру - person Ashley Mills; 24.04.2018