Я хочу получить конкретные данные из файла JSON

#ios #json #swift #xcode

#iOS #json #swift #xcode

Вопрос:

Я пытаюсь получить данные «times» из этого файла json:

 {"code":200,"status":"OK","results":{"datetime":[{"times":
{"Imsak":"04:18","Sunrise":"05:48","Fajr":"04:28","Dhuhr":"12:00","Asr":"15:30","Sunset":"18:13","Maghrib":"18:26","Isha":"19:32","Midnight":"23:20"},"date":{"timestamp":1553817600,"gregorian":"2019-03-29","hijri":"1440-07-22"}}],
"location":{"latitude":30.04442024230957,"longitude":31.2357120513916,"elevation":30.0,"city":"Cairo","country":"Egypt","country_code":"EG","timezone":"Africa/Cairo","local_offset":2.0},
"settings":{"timeformat":"HH:mm","school":"Ithna Ashari","juristic":"Shafii","highlat":"None","fajr_angle":18.0,"isha_angle":18.0}}}
  

Но я не знаю, как получить только числовые значения этой строки:
{"datetime":[{"times":
{"Imsak":"04:18","Sunrise":"05:48","Fajr":"04:28","Dhuhr":"12:00","Asr":"15:30","Sunset":"18:13","Maghrib":"18:26","Isha":"19:32","Midnight":"23:20"}

Я написал эту функцию

 let urlString = "https://api.pray.zone/v2/times/today.json?city=cairo"

    func getDataFromURL() {
        let url = URL(string: urlString)
        URLSession.shared.dataTask(with: url!) { (data, response, error) in
            if error != nil {
                print(error!.localizedDescription)
            } else {
                do {
                    let parsedData = try JSONSerialization.jsonObject(with: data!) as! [String: Any]
                    print(parsedData)
                } catch let error as NSError {
                    print(error.localizedDescription)
                }
            }
        }.resume()
    }
}
  

Я хочу заменить print(parsedData) правильными строками, которые позволят мне получить то, что я хочу, из файла, которые соответствуют времени молитвы.

Комментарии:

1. Совет профессионала: используйте app.quicktype. ввод-вывод для преобразования вашего json в кодируемую структуру или добавления классов в ваш проект

Ответ №1:

Согласно вашему Json, исходное решение:

 //......

//lines from print(parsedData)
print(parsedData)

if let results = parsedData["results"] as? [String:Any] {
    if let datetimes = results["datetime"] as? [Any] {
        for datetime in datetimes {
            if let datetimeDict = datetime as? [String:Any] {
                if  let times = datetimeDict["times"] as? [String:String] {
                    let timeNumbers = times.values.sorted()
                    print(timeNumbers)
                }
            }
        }
    }
}

//......
  

Вывод:

 ["04:17", "04:27", "05:47", "12:00", "15:30", "18:13", "18:27", "19:33", "23:20"]
  

Ответ №2:

Следующее используется JSONDecoder для чтения ваших данных.

 // Parsing data //
do {
    let result = try JSONDecoder().decode(MyData.self, from: data!)
    let results = result.results
    let dateTime = results.datetime
    let times = dateTime[0].times
    print(times) // TimeData(Imsak: "04:18", Sunrise: "05:48", Fajr: "04:28", Dhuhr: "12:00", Asr: "15:30", Sunset: "18:13", Maghrib: "18:26", Isha: "19:32", Midnight: "23:20")
} catch let error as NSError {
    print("(error)")
}

// MyData.swift //
import UIKit

struct MyData: Decodable {
    let code: Int
    let status: String
    let results: ResultsData
}

struct ResultsData: Decodable {
    let datetime: [DateTimeData]
    let location: LocationData
    let settings: SettingsData
}

struct DateTimeData: Decodable {
    let times: TimeData
    let date: DateData
}

struct TimeData: Decodable {
    let Imsak: String
    let Sunrise: String
    let Fajr: String
    let Dhuhr: String
    let Asr: String
    let Sunset: String
    let Maghrib: String
    let Isha: String
    let Midnight: String
}

struct DateData: Decodable {
    let timestamp: Double
    let gregorian: String
    let hijri: String
}

struct LocationData: Decodable {
    let latitude: Double
    let longitude: Double
    let elevation: Double
    let city: String
    let country: String
    let country_code: String
    let timezone: String
    let local_offset: Double
}

struct SettingsData: Decodable {
    let timeformat: String
    let school: String
    let juristic: String
    let highlat: String
    let fajr_angle: Double
    let isha_angle: Double
}