Ошибка при разборе JSON в Swift, [String: Any] не будет работать

-3

Я пытаюсь разобрать этот 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?

  • 3
    Ваш JSON является массивом. Так что это не может быть [String:Any] который является Словарём. Так что это [Any] (массив) по крайней мере. Теперь, если мы посмотрим больше, это массив словарей, ключами которого являются строки, поэтому он выглядит as [[String:Any]]
Теги:
xcode
macos

3 ответа

2
Лучший ответ

Похоже, что ответ JSON, возвращаемый сервером, представляет собой массив, содержащий словари типа [String: Any] чтобы вы могли:

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

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

Здесь вы можете загрузить игровую площадку, которую я написал, чтобы проверить ее.

  • 0
    Приятно! Также вы пробовали песочницу IBM Swift ? Это игровая площадка, которую не нужно загружать, и ее было бы проще протестировать.
  • 0
    Нет, я еще не пробовал. Но спасибо, что дали мне знать.
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?
}
0

у вас есть ответ массива синтаксического анализа, поэтому вам нужно ввести cast json as? [[String: Any]].. если ваш ответ является диктатором, вам нужно разобрать, как json, как? [Строка: любая]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню