Не удается проанализировать ответ api

#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 as success .

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) определение метода?