Не удалось разобрать ответ API

У меня есть ответ 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...

Не удалось разобрать ответ API

Вы уверены, что ваш API возвращает JSON, как вы ожидаете. Потому что на скриншоте вашего отладчика я вижу, что url имеет status строку и description как success .

Aks 28.03.2019 12:28

@asd2: напечатайте jsonData и проверьте, действительно ли json, отправленный сервером, содержит все данные или нет

Sandeep Bhandari 28.03.2019 12:29

вместо использования jsonSerialization используйте: if let result = response.result.value { let JSON = result as! NSDictionary print(JSON) let metaData = try JSONDecoder().decode(MetaData.self, from: JSON) }

Sanad Barjawi 28.03.2019 12:31

Почему вы хотите передать его NSDictionary? @SanadBarjawi Это тип Data.

Aks 28.03.2019 12:40

Попробуйте использовать let jsonData = jsonString.data(используя: .utf8) Затем передайте его в JSONDecoder

Sanad Barjawi 28.03.2019 13:01

Ваша главная проблема, которая вызывает все ваши подобные вопросы, это WebServiceClient. В чем его польза? Этот танец сериализации ужасен и очень неэффективен. Может ли WebServiceClient вернуться необработанным Data? Если да, используйте вывод Data для JSONDecoder. Если нет, ищите лучший API. Если вы не можете удалить WebServiceClient, проанализируйте словарь традиционным способом с подпиской на ключ и индекс.

vadian 28.03.2019 13:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
165
1

Ответы 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.

Но что мне дать вместо jsonString @Aks..?

user11100093 28.03.2019 12:48

Я пробовал что-то вроде этого...` пусть jsonData = результат? error.localizedDescription) } ` Но я все равно ничего не получаю parsedData

user11100093 28.03.2019 12:48

Можете ли вы опубликовать свое определение метода WebServiceClient.shared.getMeta(withParameters: parameters)?

Aks 28.03.2019 15:54

Другие вопросы по теме