Доступ к вложенным словарям в JSON с помощью Swift - PullRequest
0 голосов
/ 09 декабря 2018

Я хочу проанализировать следующее JSON , чтобы получить идентификатор случайной статьи из API Википедии и использовать его в Swift:

{
"batchcomplete": "",
"continue": {
    "rncontinue": "0.067678657404|0.067678667039|13394072|0",
    "continue": "-||"
},
"query": {
    "random": [
        {
            "id": 34538560,
            "ns": 3,
            "title": "User talk:59.188.42.121"
        }
    ]
}
}

Я хочу иметь возможностьполучить доступ к значениям "id" и "title" из него, и в настоящее время у меня есть следующее для доступа к "query":

let url = URL(string: "https://en.wikipedia.org/w/api.php?action=query&list=random&rnlimit=1&format=json")
    URLSession.shared.dataTask(with: url!) { (data, response, err) in
        guard let data = data else { return }
        if err != nil {
            print(err!)
        } else {
            do {
                let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? NSDictionary
                if let result = json! as? [String: AnyObject] {
                    if let result = result["query"]! as? [String: AnyObject] {
                        print(result)
                    }
                }
            } catch {
                print("Error")
            }
        }
    }.resume()

Прямо сейчас приведение типа вниз не является чем-то, чем я горжусьделать, и это очень запутанно очень быстро.Я также однажды попробовал приведение типов, выполнив что-то вроде следующего, но безрезультатно:

[String: [String: [String:AnyObject]]]

Есть ли лучший способ получить доступ к этим значениям?Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 09 декабря 2018

Если вы используете Swift 4, есть Codable.Использование Codable подразумевает определение пользовательских структур / классов для JSON, но такие приложения, как quicktype.io , могут сделать это просто: вы просто вставляете JSON, и он генерирует структуры для вас.

Во-первых, структура для хранения ответа из Википедии:

struct Response: Codable {
    struct Query: Codable {
        let random: [Random]
    }

    struct Random: Codable {
        let id, ns: Int
        let title: String
    }

    struct Continue: Codable {
        let rncontinue, continueContinue: String

        enum CodingKeys: String, CodingKey {
            case rncontinue
            case continueContinue = "continue"
        }
    }

    let batchcomplete: String
    let `continue`: Continue
    let query: Query

    enum CodingKeys: String, CodingKey {
        case batchcomplete, `continue`, query
    }
}

И расшифровка JSON:

let url = URL(string: "https://en.wikipedia.org/w/api.php?action=query&list=random&rnlimit=1&format=json")
URLSession.shared.dataTask(with: url!) { (data, response, err) in
    guard let data = data else { return }
    guard err == nil else { print(err!); return }

    do {
        let response = try JSONDecoder().decode(Response.self, from: data)
        if let firstArticle = response.query.random.first {
            print(firstArticle)
        } else {
            print("No Article")
        }
    } catch {
        print(error)
    }
}.resume()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...