2017-02-13 2 views
-4

Я пытаюсь разобрать JSON Url в UICollectionView, но я продолжаю получать Не могу отличить значение типа '__NSArrayI' (0x1010ebd88) к 'NSDictionary' (0x1010ec288). как ошибка при попытке загрузить данные. Я использую xcode 8 с Swift 3.0. Кто-нибудь может увидеть ошибку, которую я получаю, и как ее исправить? Не уверен, куда идти отсюда.Разбор JSON в Swfit 3.0 Бросок NSArray в NSDictionary Ошибка

let link = "http://www.flickr.com/services/feeds/photos_public.gne?tags=swimming&format=json&nojsoncallback=1" 

    let urlString = link 

    let url = URL(string: urlString) 
    URLSession.shared.dataTask(with:url!) { (data, response, error) in 
     if error != nil { 
      print(error) 
     } else { 
      do { 

       let parsedData = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any] 
       let currentConditions = parsedData["items"] as! [String:Any] 

       print(currentConditions) 

       let currentItem = currentConditions["link"] as! [String:Any] 
       print(currentItem) 

      } catch let error as NSError { 
       print(error) 
      } 
     } 

     }.resume() 

Edit: OK Так что я пошел так далеко, и теперь в «пунктов», есть еще одна строка, что мне нужно извлечь в массив. Внутри элементов есть несколько «link =» Мне нужна ссылка в массиве, но не знаю, как ее получить. Когда я печатаю значение ключа, элементы отображаются, но это, кажется, всего одна длинная строка, а не в массиве или словаре. Любой совет? Спасибо,

  let urlString = link 
    var itemArray: Any? 
    var parsedData: [String:Any] = ["":""] 

    let url = URL(string: urlString) 
    URLSession.shared.dataTask(with:url!) { (data, response, error) in 
     if error != nil { 
      print(error) 
     } else { 
      do { 

       parsedData = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any] 
       itemArray = parsedData["items"] as! [[String:Any]] 



       for (key, value) in parsedData { 
        print("\(key) - \(value) ") 
       } 



      } catch let error as NSError { 
       print(error) 
      } 
     } 

     }.resume() 

    guard let images_array = parsedData["items"] as? NSArray else 
    { 
     print("error2") 
     return 
    } 
+0

В вашем JSON, 'parsedData [ "пункты"]' является массивом, а не словарь, так что вы должны быть приведения его в '[[String: Любой]]'. 'currentConditions [" link "]' также не словарь, это 'String'. – dan

+0

OK Это помогло распечатать текущие условия. теперь это не позволяет мне вытащить «ссылку» из currentConditions, даже когда я установил ее в строку. код, который я обновил, чтобы currentItem = currentConditions ["link"] как! String В настоящее время отправление ошибки не может индексировать значение типа [[String: Any]] с индексом типа «String» –

ответ

0

Вы можете использовать это: С данные в элементах - это массив словарей, а ссылка не во внутреннем массиве, это основной словарь, поэтому вы можете легко получить это, передав ссылку в качестве ключа.

let link = "http://www.flickr.com/services/feeds/photos_public.gne?tags=swimming&format=json&nojsoncallback=1" 

     let urlString = link 

     let url = URL(string: urlString) 
     URLSession.shared.dataTask(with:url!) { (data, response, error) in 
      if error != nil { 
       print(error) 
      } else { 
       do { 

        let parsedData = try JSONSerialization.jsonObject(with: data!, options: []) as! [String:Any] 
        let currentConditions = parsedData["items"] as! [[String:Any]] 

        print(currentConditions) 

        let currentItem = parsedData["link"] as! String 
        print(currentItem) 

       } catch let error as NSError { 
        print(error) 
       } 
      } 

      }.resume() 
0

Как уже упоминалось в комментариях parsedData["items"] представляет собой массив, а значение ключа link является строкой, так что вам нужно использовать цикл:

typealias JSONDictionary = [String:Any] // for convenience 

... 

if let parsedData = try JSONSerialization.jsonObject(with:data!, options: []) as? JSONDictionary { 
     // print(jsonData) 
     guard let currentConditions = parsedData["items"] as? [JSONDictionary] else { return } 
     for condition in currentConditions { 
      print(condition["link"] as! String) 
     } 
    } 
} 
Смежные вопросы