IOS / Swift: анализ данных и словаря JSON - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь проанализировать некоторые вложенные файлы JSON, полученные с помощью API, но у меня возникают проблемы с выделением определенных пар ключ-значение.На самом деле, у меня есть некоторая путаница по поводу разницы между данными JSON и словарем, полученным в результате сериализации.

Для извлечения данных, которые я использую:

let task = URLSession.shared.dataTask(with: request) { data, response, error in
            guard let data = data, error == nil else {                                                 
                return
            } 

Чтобы преобразовать данные вСловарь JSON, я делаю

do {
                let stringDic = try JSONSerialization.jsonObject(with: data, options: []) as? [String : Any]
            } catch let error {
                print(error)
            }

При печати получается вложенный вывод в форме:

Optional(["document_tone": {
    "tone_categories" =     (
                {
            "category_id" = "emotion_tone";
            "category_name" = "Emotion Tone";
  and so forth

Мой вопрос заключается в том, как получить уникальное значение, например значение дляключ category_name?

Если я попытаюсь использовать

let myCat = stringDic["category_name"]

Исправить - для этого требуется let document_tone = stringDic?["document_tone"], который при печати на консоли просто печатает весь словарь снова.

Заранее спасибо за любые предложения.

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Я думаю, что лучше использовать Decodable

struct Root:Decodable {
     let documentTone : InnerItem 
} 
struct InnerItem:Decodable {
     let toneCategories: [BottomItem] 
}  
struct BottomItem:Decodable {
     let categoryId: String
     let categoryName: String 
}

do {
   let decoder = JSONDecoder()
   decoder.keyDecodingStrategy = .convertFromSnakeCase
   let result = try decoder.decode(Root.self, from: data)
   //print all names 
   result.documentTone.toneCategories.forEach {print($0.categoryName) }
} catch {
  print(error)
}
0 голосов
/ 22 сентября 2018

Это довольно просто: () - это массив, {} - это словарь, и компилятор должен знать статические типы всех подписанных объектов:

if let documentTone = stringDic?["document_tone"] as? [String:Any],
   let toneCategories = documentTone["tone_categories"] as? [[String:Any]] {
   for category in toneCategories {
       print(category["category_name"])
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...