Как получить доступ к ключу определения, который вложен в несколько уровней массивов и словарей API Оксфордских словарей? - PullRequest
0 голосов
/ 21 декабря 2018

Я учусь в классе по разработке приложений для iOS Swift в моей школе.Я пытаюсь получить доступ к ключу определения в Oxford English Dictionary 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: Picture of API Structure

1 Ответ

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

Если вы кодируете в 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()

При этом будет напечатана

игральная карта с одним пятном на ней, которая считается самой высокой картой в масти в большинстве карточных игр

человек, который выделяется в определенном виде спорта или другой деятельности

(в теннисе и подобных играх) услугой, которую противник не может вернуть, и, таким образом, получает очко.

человек, который не имеетсексуальные чувства или желания

очень хорошо

(человека) без сексуальных чувств или желаний, бесполое

(в теннисе и подобных играх) служат тузом противпротивник)

получить высокие оценки в (тест или экзамен)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...