#ios #json #swift
#iOS #json #swift
Вопрос:
У меня есть ответ api, который выглядит следующим образом…Я правильно получаю ответ от api..
{
"status": "success",
"data": {
"meta": {
"url": "htt..://www.abc.com",
"title": “ASD - Log In or Sign Up",
"description": "Create an account or log in….”,
"display_url": "htt..://www.abc.com/",
"video_url": "",
"image": "htt..://www.asd.com/images/asds_325x325.png",
"img_wxh": "325x325"
}
}
}
Класс модели, с помощью которого я анализирую эти данные, указан следующим образом..
struct MetaData: Codable {
let status: String?
let data: DataClass?
}
struct DataClass: Codable {
let meta: Meta
}
struct Meta: Codable {
let url: String
let title, description: String
let displayURL: String
let videoURL: String
let image: String
let imgWxh: String
enum CodingKeys: String, CodingKey {
case url = "url"
case title = "title"
case description = "description"
case displayURL = "display_url"
case videoURL = "video_url"
case image = "image"
case imgWxh = "img_wxh"
}
}
Выполняемый вызов api выдает, как показано ниже…
WebServiceClient.shared.getMeta(withParameters: parameters) { [weak self] (isSuccess, result) in
guard let `self` = self else { return }
if isSuccess, result != nil {
if let jsonData = try? JSONSerialization.data(withJSONObject: result as Any, options: []) {
do {
let metaData = try JSONDecoder().decode(MetaData.self, from: jsonData)
self.metaDataImageView.sd_setImage(with: URL(string: metaData.data?.meta.image ?? ""), completed: nil)
self.urlLabel.text = metaData.data?.meta.url
self.titleLabel.text = metaData.data?.meta.title
self.urlDescriptionLabel.text = metaData.data?.meta.description
} catch {
print("error (error)")
}
}
}
Но я получаю все данные как ноль…в чем может быть причина ..?
Я ничего не получаю metaData
…
Комментарии:
1. Вы уверены, что ваш API возвращает JSON, как вы ожидаете. Потому что на скриншоте вашего отладчика я вижу, что
url
естьstatus
string иdescription
assuccess
.2. @asd2: распечатайте
jsonData
и проверьте, действительно ли json, отправленный сервером, содержит все данные или нет3. вместо использования JSONSerialization используйте:
if let result = response.result.value { let JSON = result as! NSDictionary print(JSON) let metaData = try JSONDecoder().decode(MetaData.self, from: JSON) }
4. Почему вы хотите привести его к
NSDictionary
? @SanadBarjawi ЭтоData
тип.5. Попробуйте использовать let jsonData = jsonString.data (используя: .utf8) Затем передайте его в JSONDecoder
Ответ №1:
Вот код, который я пытался проанализировать ваши данные
struct MetaData: Codable {
let status: String?
let data: DataClass?
}
struct DataClass: Codable {
let meta: Meta
}
struct Meta: Codable {
let url: String
let title, description: String
let displayURL: String
let videoURL: String
let image: String
let imgWxh: String
enum CodingKeys: String, CodingKey {
case url = "url"
case title = "title"
case description = "description"
case displayURL = "display_url"
case videoURL = "video_url"
case image = "image"
case imgWxh = "img_wxh"
}
}
let jsonString = """
{
"status": "success",
"data": {
"meta": {
"url": "htt..://www.abc.com",
"title": "ASD - Log In or Sign Up ",
"description": "Create an account or log in….",
"display_url": "htt..://www.abc.com/",
"video_url": "",
"image": "htt..://www.asd.com/images/asds_325x325.png",
"img_wxh": "325x325"
}
}
}
"""
let jsonData = jsonString.data(using: .utf8)
do {
let parsedData = try JSONDecoder().decode(MetaData.self, from: jsonData!)
print(parsedData)
} catch {
print(error.localizedDescription)
}
И это работает.
Также у вашего json есть некоторые проблемы, поэтому убедитесь, что вы подтвердили свой формат json. вы можете использовать jsonlint.com для проверки json.
Комментарии:
1. Но что мне дать вместо jsonString @Aks ..?
2. Я пробовал что-то вроде этого …` позвольте jsonData = result?.description.data(используя: .utf8) сделайте { позвольте parsedData = попробуйте JSONDecoder().decode(MetaData.self, из: jsonData!) } catch { print(error.localizedDescription) } ` Но все равно я ничего не получаю в
parsedData
3. Можете ли вы опубликовать свое
WebServiceClient.shared.getMeta(withParameters: parameters)
определение метода?