Что передать ответ JSON, как в JsonSerialization для конкретного ответа Json

JSON-ответ:

{
    "matches": [
        {
        "platformId": "EUW1",
        "gameId": 3427082245,
        "champion": 21,
        "queue": 450,
        "season": 9,
        "timestamp": 1511224973899,
        "role": "NONE",
        "lane": "MID"
        }
    ],
    "startIndex": 0,
    "endIndex": 1,
    "totalGames": 136
}

Сериализация:

let myJsonMatchList = try JSONSerialization.jsonObject(with: content, options: JSONSerialization.ReadingOptions.mutableContainers) as! <Array<Dictionary<String,Any>>

Не удалось преобразовать значение типа __NSDictionaryM (0x10b693260) в NSArray (0x10b692dd8).

Проблема в том, что Array Dictionary String Any Замена его на AnyObject работает, но не позволяет мне получить доступ к чему-либо изнутри, то есть, кроме как просто распечатать необработанный Json.

Какова правильная структура этой сериализации, потому что я застрял?


person Community    schedule 21.11.2017    source источник
comment
Я ясно вижу, что ответ json - это словарь   -  person Harish Pathak    schedule 21.11.2017
comment
Что делать с ответом JSON, как в JsonSerialization для конкретного ответа Json: из чтения JSON становится очевидным, что JSON является словарем на верхнем уровне. Из сообщения об ошибке Не удалось преобразовать значение типа __NSDictionaryM (0x10b693260) в NSArray (0x10b692dd8). Он говорит то же самое, а вы думаете, что это массив.   -  person Larme    schedule 21.11.2017


Ответы (1)


JSON — это объект, который сопоставляется со словарем. Массив соответствует совпадениям, доступ к которым осуществляется изнутри объекта.

ну попробуй это..

if let myJsonMatchList = try JSONSerialization.jsonObject(with: content, options: []) as? [String: Any] {
    if let arr = myJsonMatchList["matches"] as? [[String: Any]] {
         print(arr)
    }
}

Вот код, работающий на детской площадке

var str = "{\"matches\": [{\"platformId\": \"EUW1\",\"gameId\": 3427082245,\"champion\": 21,\"queue\": 450,\"season\": 9,\"timestamp\": 1511224973899,\"role\": \"NONE\",\"lane\": \"MID\"}],\"startIndex\": 0,\"endIndex\": 1,\"totalGames\": 136}"

var data = str.data(using: .utf8)
if let myJsonMatchList = try JSONSerialization.jsonObject(with: data!, options: []) as? [String: Any] {
    if let arr = myJsonMatchList["matches"] as? [[String: Any]] {
        print(arr)
    }
}
person Scriptable    schedule 21.11.2017
comment
arr — это массив, поэтому вы можете сделать arr.first (чтобы получить первый элемент в списке) или for item in arr { ... }. Если у вас есть один элемент из массива, вы будете использовать те же методы. let first = arr.first; let gameId = first["gameId"] as String - person Scriptable; 21.11.2017
comment
Я чувствую, что это будет очень медленный день. - person ; 21.11.2017
comment
Пожалуйста, не принимайте эту .mutableContainers чепуху. Это дважды нонсенс, потому что #1 результат присваивается константе, которая является imизменяемой, а #2 даже без .mutableContainers вы получаете изменчивость в Swift при назначении результата variable. - person vadian; 21.11.2017
comment
@vadian согласился, ответ был изменен из кода OP, но теперь он удален, и параметры не установлены, поскольку они не нужны. - person Scriptable; 21.11.2017
comment
Спасибо. Вы даже можете опустить параметр options. - person vadian; 21.11.2017