【问题标题】:How do I access the definitions key that is nested inside multiple levels of arrays and dictionaries of the Oxford Dictionaries API?如何访问嵌套在牛津词典 API 的多级数组和词典中的定义键?
【发布时间】:2019-05-22 02:30:44
【问题描述】:

我是高中 iOS Swift 应用程序开发课程的学生。我正在尝试访问 Oxford English Dictionary API 中的定义键,该 API 嵌套在多个数组和字典中。我已经访问了“lexicalEntries”键中的数据,但我无法在 API 中进一步工作。

我尝试了许多不同的方法来解包数据,但都没有奏效。注释掉的是我尝试使用的一些技术,我将其包括在内以提供一些背景信息。

func parse() {
    let word_id = word.lowercased()
    let url = URL(string: "https://od-api.oxforddictionaries.com:443/api/v1/entries/\(language)/\(word_id)")!
    //        let word = id
    //        let otherDefinitions = subsenses
    var request = URLRequest(url: url)
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    request.addValue(appId, forHTTPHeaderField: "app_id")
    request.addValue(appKey, forHTTPHeaderField: "app_key")
    let session = URLSession.shared
    _ = session.dataTask(with: request, completionHandler: { data, response, error in
        if let response = response,
            let data = data,
            let jsonData = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String: AnyObject] {
            //                print(response)
            //                print(jsonData)
            //                print(jsonData["results"] as Any)
            //                print(jsonData["entries"] as Any) // does not work
            //

            let results = jsonData["results"] as? [JSONDictionary]
            // let entries = jsonData["entries"] as Any //does not work
            for result in results! {
                print(result)
            }
            //working through entries level
            //                let lexicalEntries = results?["lexicalEntries"] as? [String:String]
            //                print(lexicalEntries)
            //                let entries = jsonData["entries"] as Any
            //                let senses = jsonData["senses"] as Any
            //                let definitions = jsonData["definitions"] as Any
            //                print(entries)
        } else {
            print(error ?? print("default Value Called"))
            print(NSString.init(data: data!, encoding: String.Encoding.utf8.rawValue)!)

        }
    }).resume()
}

在我所有的尝试中,我唯一能够解析的嵌套数据是“lexicalEntries”。我无法通过该点访问 API 中的定义键。

API 结构图:

【问题讨论】:

    标签: json swift api dictionary


    【解决方案1】:

    如果您使用 Swift 4 或更高版本进行编码,则应使用 Codable 协议并构造 API 返回的数据。

    struct Root: Codable {
        let metadata: Metadata
        let results: [Result]
    }
    struct Metadata: Codable {
        let provider: String
    }
    struct Result: Codable {
        let id: String
        let language: String
        let lexicalEntries: [Lexical]
    }
    struct Lexical: Codable {
        let entries: [Entry]
    }
    struct Entry: Codable {
        let etymologies: [String]?
        let grammaticalFeatures: [Feature]
        let homographNumber: String
        let senses: [Sense]
    }
    struct Feature: Codable {
        let text: String
        let type: String
    }
    struct Sense: Codable {
        let definitions: [String]
        let domains: [String]?
        let examples: [Example]
        let id: String
        let short_definitions: [String]
    }
    struct Example: Codable {
        let registers: [String]?
        let text: String
    }
    

    然后你就可以轻松解析你的 JSON 数据响应了:

    import PlaygroundSupport
    PlaygroundPage.current.needsIndefiniteExecution = true
    
    let wordId = "Ace"
    let url = URL(string: "https://od-api.oxforddictionaries.com:443/api/v1/entries/en/\(wordId)")!
    let appId = "********"
    let appKey = "********************************"
    var request = URLRequest(url: url)
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    request.addValue(appId, forHTTPHeaderField: "app_id")
    request.addValue(appKey, forHTTPHeaderField: "app_key")
    URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data else { return }
        print(String(data: data, encoding: .utf8) ?? "")
        do {
            let root = try JSONDecoder().decode(Root.self, from: data)
            let results = root.results
            for result in results {
                for lexical in result.lexicalEntries {
                    for entry in lexical.entries {
                        for sense in entry.senses {
                            for definition in sense.definitions {
                                print(definition)
                            }
                        }
                    }
                }
            }
        } catch {
            print(error)
        }
        
    }.resume()
    

    这将打印出来

    一张只有一个点的纸牌,在大多数纸牌游戏中被列为花色最高的牌

    擅长某项运动或其他活动的人

    (在网球和类似比赛中)对手无法返回并因此赢得一分的发球。

    没有性感觉或欲望的人

    很好

    (某人)没有性感觉或欲望,无性的

    (在网球和类似比赛中)对(对手)发球

    在(考试或考试)中取得高分

    【讨论】:

      猜你喜欢
      • 2014-02-27
      • 1970-01-01
      • 2019-12-02
      • 2018-11-06
      • 1970-01-01
      • 2019-08-15
      • 2012-11-03
      • 1970-01-01
      • 2010-09-22
      相关资源
      最近更新 更多