2016-12-15 3 views
1

Прошу прощения, если это простой вопрос, но я застрял. Я попытался прочитать все, что могу, чтобы сам это исправить.Получить JSON Element in Swift 3

Я пытаюсь извлечь URL из данных JSON, я получаю данные JSON в порядке, и я могу распечатать его на консоли, однако я не могу понять, как получить доступ к URL-адресу аудиофайла.

Это код, я использую, чтобы получить JSON:

let session = URLSession.shared 
    _ = session.dataTask(with: request, completionHandler: { data, response, error in 
     if let response = response, 
      let data = data, 
      let jsonData = try? JSONSerialization.jsonObject(with: data, options: .mutableContainers) { 

      if let dictionary = jsonData as? [String: Any] { 
       if let prounce = dictionary["pronunciations"] as? [String: Any]{ 
        if let audioPath = prounce["audioFile"] as? String { 
         print(audioPath) 
        } 

       } 
      } 

      print(response) 
      print(jsonData) 
     } else { 
      print(error) 
      print(NSString.init(data: data!, encoding: String.Encoding.utf8.rawValue)) 
     } 
    }).resume() 

Выход я получаю:

metadata =  { 
    provider = "Oxford University Press"; 
}; 
results =  (
      { 
     id = maladroit; 
     language = en; 
     lexicalEntries =    (
          { 
       entries =      (
              { 
         etymologies =        (
          "late 17th century: French" 
         ); 
         grammaticalFeatures =        (
                  { 
           text = Positive; 
           type = Degree; 
          } 
         ); 
         senses =        (
                  { 
           definitions =          (
            "inefficient or inept; clumsy:" 
           ); 
           examples =          (
                      { 
             text = "both men are unhappy about the maladroit way the matter has been handled"; 
            } 
           ); 
           id = "m_en_gb0494140.001"; 
          } 
         ); 
        } 
       ); 
       language = en; 
       lexicalCategory = Adjective; 
       pronunciations =      (
              { 
         audioFile = "http://audio.oxforddictionaries.com/en/mp3/maladroit_gb_1.mp3"; 
         dialects =        (
          "British English" 
         ); 
         phoneticNotation = IPA; 
         phoneticSpelling = "\U02ccmal\U0259\U02c8dr\U0254\U026at"; 
        } 
       ); 
       text = maladroit; 
      } 
     ); 
     type = headword; 
     word = maladroit; 
    } 
); 

}

Я хочу, чтобы получить URL называется audioFile в произношения. Буду признателен за любую оказанную помощь.

+0

верхний оператор представлен при использовании инструкции для печати? –

+1

Покажите фактический ответ JSON вместо отображения вывода консоли. –

ответ

0

Если моя догадка правильная, то на выходе, показанном выше, отсутствует верхняя скоба { в верхней части вывода.

(Я также предполагая, что выход берется из вашего print(jsonData).)

Ваш jsonData является словарь, содержащий два значения:

  • словарю значение для «метаданных»
  • Массив значение для «результатов»

Таким образом, вы не можете получить значение для «произношения» непосредственно с jsonData (или dictionary).

Вам может понадобиться:

  • Получение значения для «результатов» от jsonData, это массив
  • Выберите один элемент из «результатов», это словарь
  • Получить значение «lexicalEntries» от результата, это массив
  • Выберите один элемент из «lexicalEntries», это словарь
  • Получить значение «произношением» из lexicalEntry, я т это массив
  • Выберите один элемент из «произношения», это словарь

Здесь Вы можете получить доступ к значениям в каждом произношении словаря. В коде, вам нужно сделать что-то вроде этого: (. Вы можете использовать let result = results.first вместо !results.isEmpty, case let result = results[0], если вы всегда использовать первый элемент для массивов Другие две строки, начиная с !...isEmpty, case let... а.)

if 
    let dictionary = jsonData as? [String: Any], 
    let results = dictionary["results"] as? [[String: Any]], 
    //You need to choose one from "results" 
    !results.isEmpty, case let result = results[0], 
    let lexicalEntries = result["lexicalEntries"] as? [[String: Any]], 
    //You need to choose one from "lexicalEntries" 
    !lexicalEntries.isEmpty, case let lexicalEntry = lexicalEntries[0], 
    let pronunciations = lexicalEntry["pronunciations"] as? [[String: Any]], 
    //You need to choose one from "lexicalEntries" 
    !pronunciations.isEmpty, case let pronunciation = pronunciations[0] 
{ 
    //Here you can use `pronunciation` as a Dictionary containing "audioFile" and some others... 
    if let audioPath = pronunciation["audioFile"] as? String { 
     print(audioPath) 
    } 
} 

Вам нужно копать в целевой элемент от внешнего элемента шаг за шагом.

+0

Совершенно благодарю вас за то, что он сломал все это, теперь имеет больше смысла, и у меня работает код. – Joby

+0

@ Джоби, не забудьте принять ответ, если это полезно – courteouselk

+0

Сделано спасибо за подталкивание. – Joby