Я пытаюсь разобрать этот JSON в Swift 3, но он падает.
Здесь код
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
}
При попытке исправить ошибку в первом коде я думал, что этот код может работать (потому что он говорит, что не может преобразовать Array в словарь):
let jsono = try JSONSerialization.jsonObject(with: data1, options: []) as! [String]
но это результат...
Could not cast value of type '__NSDictionaryI' (0x7fffe9cba108) to 'NSString' (0x7fffea072f38).
Тогда как я могу разобрать этот JSON?
Похоже, что ответ JSON, возвращаемый сервером, представляет собой массив, содержащий словари типа [String: Any]
чтобы вы могли:
if let array = jsono as? [[String: Any]] {
print("test") // Will print
for dictionary in array {
print(dictionary["url"] as! String)
}
}
Здесь вы можете загрузить игровую площадку, которую я написал, чтобы проверить ее.
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?
}
у вас есть ответ массива синтаксического анализа, поэтому вам нужно ввести cast json as? [[String: Any]].. если ваш ответ является диктатором, вам нужно разобрать, как json, как? [Строка: любая]
[String:Any]
который является Словарём. Так что это[Any]
(массив) по крайней мере. Теперь, если мы посмотрим больше, это массив словарей, ключами которого являются строки, поэтому он выглядитas [[String:Any]]