我试图解析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?
答案 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?
}