在Swift中解析JSON时出错,[String:Any]无法正常工作

时间:2017-05-20 08:20:33

标签: json swift xcode macos

我试图解析Swift 3中的this JSON,但它崩溃了。

这是代码

do{
   let data1: Data = try! Data(contentsOf: NSURL(string: "https://gist.githubusercontent.com/DesWurstes/00baf946bd6d27e7e9355bd6e9969230/raw/a0de898faea8ddedb11b0db516967d0666255633/gist.json") as! URL)
   let jsono = try JSONSerialization.jsonObject(with: data1, options: []) as! [String: Any]
}catch{
   // catch isn't used here.
}

这是我崩溃时遇到的错误:

Could not cast value of type '__NSArrayI' (0x7fffe9cb9c08) to 'NSDictionary' (0x7fffe9cba158).

崩溃是因为并非所有数组元素都是字符串。 (JSON的根是一个数组。)

为了防止它崩溃,用这个改变第三行是合适的:

let jsono = try JSONSerialization.jsonObject(with: data1, options: [])

但是,它的类型将是Any,我无法用

解析它
let string = jsono["something"] as! [String: Any] // Type "Any" has no subscript members

并且此代码不会运行:

if let array = jsono as? [String: Any] {
   print("test") // Doesn't print
}

在尝试修复第一个代码中的错误时,我认为此代码可能有效(因为它说不能将数组转换为字典):

let jsono = try JSONSerialization.jsonObject(with: data1, options: []) as! [String]

但结果......

Could not cast value of type '__NSDictionaryI' (0x7fffe9cba108) to 'NSString' (0x7fffea072f38).

然后我该如何解析这个JSON?

3 个答案:

答案 0 :(得分:2)

从服务器返回的JSON响应看起来像是一个包含[String: Any]类型字典的数组,所以你可以这样做:

if let array = jsono as? [[String: Any]] {
  print("test") // Will print

  for dictionary in array {
    print(dictionary["url"] as! String)
  }
}

在这里你可以download the playground我已经写过来测试它了。

答案 1 :(得分:0)

你有解析数组响应所以你需要输入强制转换 json作为? [[String:Any]] .. 如果你的回答是dictonary那么你需要像 json一样解析? [String:Any]

答案 2 :(得分:0)

func Callservice()
{
    let jsonUrlString = "url"
    guard let url = URL(string: jsonUrlString) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, err) in
        guard let data = data else { return }
        do {

            let courses = try JSONDecoder().decode([Course].self, from: data)
            self.arrayData = courses

            print(courses)


        } catch let jsonErr {
            print("Error serializing json:", jsonErr)
        }



        }.resume()
}



struct course:decodable{
let name:string?
}