Swift JSON Тип сериализацииMismatch - PullRequest
0 голосов
/ 15 октября 2018

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

Я также пытался использовать опциональные опции

В сообщении об ошибке, которое я написал в конце, я не уверен относительно ссылки на тип Double.Поскольку у меня нет ни типа, ни чего-либо в ответе, который использует двойное число.

(я также могу сериализовать ответ json, используя старый быстрый метод приведения данных в виде словарей - [String:Любой]. Но я бы хотел использовать современный / обновленный подход.)

Ответ JSON

    {"NEWS":
  [
    {
      "DATE":"2018-10-13T03:56:06+1000",
      "SOURCE":"smh.com.au",
      "BLURB":"Assistant Treasurer Stuart Robert says he has repaid $37,975 of \"excess usage charges\" in home internet bills footed by taxpayers.",
      "ID":102347,
      "TITLE":"Stuart Robert pays back $38,000 in excessive home internet charges"
    },
    {
      "DATE":"2018-10-12T18:00:38+1000",
      "SOURCE":"itwire.com",
      "BLURB":"The CVC costs set by the NBN Co make it very difficult for ISPs to offer gigabit connections to more than a select band of customers who are willing to sign up in numbers and pay slightly more than other speed tiers, according to one ISP who caters to this type of consumer.",
      "ID":102343,
      "TITLE":"NBN gigabit connections will remain mostly a pipe dream"},
    {
      "DATE":"2018-10-12T09:48:43+1000",
      "SOURCE":"computerworld.com.au",
      "BLURB":"The Department of Home Affairs has rejects calls to include independent judicial oversight of the decision to issue Technical Assistance Notices and Technical Capability Notices as part of proposed legislation intended to tackle police agencies’ inability to access encrypted communications services.",
      "ID":102342,
      "TITLE":"Home Affairs rejects calls for additional safeguards in ‘spyware’ law"
    },
    {
    "DATE":"2018-10-11T12:16:05+1000",
    "SOURCE":"itnews.com.au",
    "BLURB":"NBN Co is hoping to “speed up” building works on the fibre-to-the-curb (FTTC) portion of its network as it tries to make up lost ground.",
    "ID":102334,
    "TITLE":"NBN Co says fibre-to-the-curb build is more complex that it hoped"
    },
  ]
}

КОД

struct Root: Decodable {
    let news: [News]?

    enum CodingKeys: String, CodingKey {
        case news = "NEWS"
    }

}

struct News: Decodable {
    let date: Date
    let source, blurb: String
    let id: Int
    let title: String

    enum CodingKeys: String, CodingKey {
        case date = "DATE"
        case source = "SOURCE"
        case blurb = "BLURB"
        case id = "ID"
        case title = "TITLE"
    }
}

Сериализация

URLSession.shared.dataTask(with: url) { (data, response, err) in  
guard let dataStr = data else {
            return
        }
do {
    let root = try JSONDecoder().decode(Root.self, from: dataStr) //error is caught here
    guard let r = root else { return }
    print(r.news)
} catch let err {
    print("JSON Error - \(err)")
}
}.resume()

Ошибка

Ошибка сериализации json typeMismatch (Swift.Double, Swift.DecodingError.Context (codingPath: [CodingKeys (stringValue: "NEWS", intValue: nil), _JSONKey (stringValue: ")Индекс 0 ", intValue: 0), CodingKeys (stringValue:" DATE ", intValue: nil)], debugDescription:" Ожидается декодировать Double, но вместо этого найдена строка / данные. ", UnderError: nil))

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Помещение JSON в Quicktype дает мне дополнительную ошибку запятой.Разве есть больше узлов в файле JSON?Поэтому сначала убедитесь в этом.На первый взгляд, я могу ошибаться, но я думаю, что вы должны отформатировать DATE, чтобы точно соответствовать.

0 голосов
/ 15 октября 2018

Это потому, что стратегия кодирования по умолчанию для даты является двойной (секунды с начала эпохи).Вы можете изменить стратегию по умолчанию на iso8061 или любую другую.Например, вы можете установить форматировщик даты в вашем декодере так:

let decoder = JSONDecoder()
decoder.dateDecodingStrategy = .iso8601
...