Как структурировать массив JSON в Swift? - PullRequest
0 голосов
/ 07 мая 2019

Я хочу структурировать свой массив JSON в Swift, чтобы я мог его использовать, но все, что я пробую, выдает ошибку.Это JSON, с которым я работаю:

[
      {
      "id": 15438,
      "date": "2019-05-07T03:36:51",
      "date_gmt": "2019-05-07T00:36:51",
      "type": "post",
      "title": {
      "rendered": "Title Here"
      }
    }
 ]

И вот код, который я использую:

struct getTitle: Decodable {
  let title: [Title]
}

struct Title: Decodable {
  let rendered: String?
}

class ViewController: NSViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    let jsonUrlString = "URL HERE"
    guard let url = URL(string: jsonUrlString) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, err) in

        guard let data = data else { return }

        do {
            let titleresult = try JSONDecoder().decode(getTitle.self, from: data)
            print(titleresult)

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

Выдает ошибку:

Error serializing json: typeMismatch(Swift.Dictionary<Swift.String, 
Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: 
"Expected to decode Dictionary<String, Any> but found an array 
instead.", underlyingError: nil))

Я уже пытался использовать

JSONDecoder().decode([getTitle].self, from: data)

, чтобы сделать его массивом, но это выдает ту же ошибку, но обернулось.Он ожидал массив, но нашел словарь.

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

Ответы [ 3 ]

2 голосов
/ 07 мая 2019

Пожалуйста, внимательно и полностью прочитайте сообщения об ошибках, они очень описательны.

Ожидается декодирование словаря, но вместо него найден массив

означает, что найденный объект являетсямассив.Так что исправление

JSONDecoder().decode([getTitle].self, from: data)

в основном верно.Но последующая ошибка совершенно другая

... codingPath: [_JSONKey (stringValue: «Index 0», intValue: 0), CodingKeys (stringValue: «title», intValue: nil)],debugDescription: «Ожидается декодирование массива, но вместо этого найден словарь».

Обратите внимание на codingPath , его можно прочитать как путь к ключу [0].title: значение для ключаtitle в первом элементе корневого массива не массив, поэтому измените структуру на

struct getTitle: Decodable {
    let title: Title
}

Чтение JSON очень просто: {} - это словарь, который становитсяструктура, [] является массивом.

Наконец, пожалуйста, напишите названия структур с заглавной буквы.

1 голос
/ 07 мая 2019

Попробуйте с этим:

struct getTitle: Decodable {
  let title: Title
}

struct Title: Decodable {
  let rendered: String?
}

class ViewController: NSViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    let jsonUrlString = "URL HERE"
    guard let url = URL(string: jsonUrlString) else { return }

    URLSession.shared.dataTask(with: url) { (data, response, err) in

        guard let data = data else { return }

        do {
            let titleresult = try JSONDecoder().decode([getTitle].self, from: data)
            print(titleresult)

        } catch let jsonErr {
            print("Error serializing json:", jsonErr)
        }
      }.resume()
    }
  }
0 голосов
/ 07 мая 2019

У вас есть корневой массив с title это словарь, а не массив

struct getTitle: Codable { 
    let title: Title 
}

struct Title: Codable {
    let rendered: String
}

let titleresult = try JSONDecoder().decode([getTitle].self, from: data)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...