Разбор плохого JSON файла - PullRequest
0 голосов
/ 26 апреля 2020

РЕДАКТИРОВАТЬ: Украшенный JSON Файл

Ниже приведен файл JSON, который я разместил на локальном сервере

{

"status": "success",

"error": "",

"response": "["{\"ip_id\":\"202\",\"ip_name\":\"P b \",\"small_desc\":\"Growth Hacker\",\"large_desc\":\"Sample description\",\"join_date\":\"\",\"vid_url\":\"https:\/\/www.theug.app\/user_videos\/pr_202.mp4\",\"img_url\":\"https:\/\/www.thnug.app\/user_thumbs\/s.jpg\",\"current_status\":\"0\",\"rate_per_hour\":\"1300\",\"currency\":\"\u20b9\"}","{\"ip_id\":\"217\",\"ip_name\":\"ss dd\",\"small_desc\":\"Talented\",\"large_desc\":\"Sample description2 \",\"join_date\":\"\",\"vid_url\":\"https:\/\/www.thug.app\/user_videos\/d.mp4\",\"img_url\":\"https:\/\/www.tsnug.app\/user_thumbs\/d.jpg\",\"current_status\":\"0\",\"rate_per_hour\":\"3850\",\"currency\":\"\u20b9\"}"]"}

Я произвел анализ, используя следующий код.


struct userData: Decodable {
  let ip_id : Int
  let ip_name : String
  let small_desc : String
  let large_desc : String
  let join_date : String
  let vid_url : String
  let img_url : String
  let current_status : Int
  let rate_per_hour : Int
  let currency : String
}

struct WebsiteDescription: Decodable {
    let status: String?
    let error: String?
    let response: [userData]
}

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let jsonUrlString = "http://0.0.0.0:8000/api-response.json"
        guard let url = URL(string: jsonUrlString) else { return }

        URLSession.shared.dataTask(with: url) { (data, response, err) in
            //perhaps check err
            //also perhaps check response status 200 OK

            guard let data = data else { return }
            print(data)
            do {
                let *users* = try JSONDecoder().decode(userData.self, from: data)
                print(users)

            } catch let jsonErr {
                print("Error serializing json:", jsonErr)
            }

        }.resume()
    }
}

Я получаю сообщение об ошибке

Error serializing json: keyNotFound(CodingKeys(stringValue: "ip_id", intValue: nil), Swift.DecodingError.Context(codingPath: [], debugDescription: "No value associated with key CodingKeys(stringValue: \"ip_id\", intValue: nil) (\"ip_id\").", underlyingError: nil))
  1. Как получить данные массива в var users ?
  2. Как использовать пользователи вар, хотя выходят за рамки моего класса?

1 Ответ

2 голосов
/ 26 апреля 2020

Прежде всего, необходимо декодировать объект root, WebsiteDescription

let result = try JSONDecoder().decode(WebsiteDescription.self, from: data)

Во-вторых, вы столкнетесь с другой проблемой: значение ключа response является вложенной секундой уровень JSON строка вместо массива JSON.

Не делай этого. JSON должен выглядеть следующим образом:

{"status":"success","error":"","response":[{"ip_id":"202","ip_name":"Prss Pus","small_desc":"Growth Hacker",...

В-третьих, пожалуйста, назовите структуры всегда с заглавной буквы.

...