У меня есть ответ 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...
@asd2: напечатайте jsonData и проверьте, действительно ли json, отправленный сервером, содержит все данные или нет
вместо использования jsonSerialization используйте: if let result = response.result.value { let JSON = result as! NSDictionary print(JSON) let metaData = try JSONDecoder().decode(MetaData.self, from: JSON) }
Почему вы хотите передать его NSDictionary? @SanadBarjawi Это тип Data.
Попробуйте использовать let jsonData = jsonString.data(используя: .utf8) Затем передайте его в JSONDecoder
Ваша главная проблема, которая вызывает все ваши подобные вопросы, это WebServiceClient. В чем его польза? Этот танец сериализации ужасен и очень неэффективен. Может ли WebServiceClient вернуться необработанным Data? Если да, используйте вывод Data для JSONDecoder. Если нет, ищите лучший API. Если вы не можете удалить WebServiceClient, проанализируйте словарь традиционным способом с подпиской на ключ и индекс.





Вот код, который я пытался разобрать ваши данные
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.
Но что мне дать вместо jsonString @Aks..?
Я пробовал что-то вроде этого...` пусть jsonData = результат? error.localizedDescription) } ` Но я все равно ничего не получаю parsedData
Можете ли вы опубликовать свое определение метода WebServiceClient.shared.getMeta(withParameters: parameters)?
Вы уверены, что ваш API возвращает JSON, как вы ожидаете. Потому что на скриншоте вашего отладчика я вижу, что
urlимеетstatusстроку иdescriptionкакsuccess.