JSON Decodable - поиск по ключу - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь сделать небольшой код, чтобы получить информацию из моего JSON через ключ.

JSON выглядит так:

{
  "Test Name": {
    "schede": {
      "info_01": "Info 01",
      "info_02": "Info 02",
      "info_03": "Info 03",
      "info_04": "Info 04",
      "info_05": "Info 05"
      },
    "Info" : "info"
  }
}

Я хочу, чтобы JSON загружался в началеиз приложения.JSON декодируется, и я хочу создать функцию, которая, передавая ключ, будет печатать всю необходимую информацию, такую ​​как schede.info_01 или информационная строка, которая находится в JSON.Это как декодируемый файл JSON

. Например, ключ в моем JSON: «Имя теста». Затем, если вы передадите в функцию строку «Имя теста», каждый результат будет напечатан так: «Имя теста» .schede.info_01 и т. д.

Я получаю JSON по ссылке

1 Ответ

0 голосов
/ 12 мая 2018

Сначала создайте модель данных из json:

struct MyData: Codable {
    let testName: TestName

    enum CodingKeys: String, CodingKey {
        case testName = "Test Name"
    }
}

struct TestName: Codable {
    let schede: [String: String]
    let info: String

    enum CodingKeys: String, CodingKey {
        case schede
        case info = "Info"
    }
}

Если вы не уверены, что ваш JSON всегда будет иметь определенное значение, вы можете сделать свойство необязательным.

затемсоздайте функцию, которая будет извлекать данные и анализировать их:

func getData(url: URL, completion: @escaping (_ data: MyData?, _ error: Error?) -> ()) {
    let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
        guard let receivedData = data else {
            completion(nil, error)
            return
        }

        do {
            // Check if there is a valid json object and parse it with JSONDecoder
            let object = try JSONDecoder().decode(MyData.self, from: receivedData)
            completion(object, nil)
        } catch {
            completion(nil, error)
        }
    }
    task.resume()
}

и вызывать вашу функцию:

    getData(url: URL(string: "https://yourexampleurl.com/myData")!) { (data, error) in
        // if you want to use the received data in the UI
        // you need to dispatch it back to the main thread
        // because dataTask executes it not on the main thread (by default)
        DispatchQueue.main.async {
            if let info1 = data?.testName.schede["info_01"] {
                print("received mt info: \(info1)")
            } else {
                let errorMessage = error?.localizedDescription ?? "unknown error"
                print("error occured: \(errorMessage)")
            }
        }
    }

Поскольку вы сопоставили структуру json с объектами Swift, вы можете получить доступ к своим данным с помощью точкиоператор:

let info1 = data.testName.schede["info_01"]

Вы можете пройти весь путь и создать модель для объекта Schede, а затем вместо синтаксического анализа его в качестве словаря вы можете получить доступ к значениям, например, таким:

let info1 = data.testName.schede.info1
...