【发布时间】:2020-07-09 10:50:32
【问题描述】:
我有以下问题,我没有正确的结构来解码来自 node-red 的响应以了解我的 Sonos 播放器的状态:
[[{"urlHostname":"192.168.1.1","urlPort":1400,"baseUrl":"http://192.168.1.1:1400","sonosName":"Sonos1","uuid":"RINCON_SONOS14001400","invisible":false},{"urlHostname":"192.168.1.2","urlPort":"1400","baseUrl":"http://192.168.1.2:1400","sonosName":"Sonos2","uuid":"RINCON_SONOS21400","invisible":false},{"urlHostname":"192.168.1.3","urlPort":"1400","baseUrl":"http://192.168.1.3:1400","sonosName":"Sonos3","uuid":"RINCON_SONOS31400","invisible":false},{"urlHostname":"192.168.1.4","urlPort":"1400","baseUrl":"http://192.168.1.4:1400","sonosName":"Sonos4","uuid":"RINCON_SONOS41400","invisible":false},{"urlHostname":"192.168.1.5","urlPort":"1400","baseUrl":"http://192.168.1.5:1400","sonosName":"Sonos5","uuid":"RINCON_SONOS51400","invisible":false},{"urlHostname":"192.168.1.6","urlPort":"1400","baseUrl":"http://192.168.1.6:1400","sonosName":"Sonos6","uuid":"RINCON_SONOS61400","invisible":false}]]
我的结构和解码调用如下所示:
typealias Response = [sonosData]
struct sonosData: Codable {
let sonos: [sonosStatusEntry]?
}
struct sonosStatusEntry: Codable {
let status: [sonosStatus]?
}
struct sonosStatus: Codable {
let urlHostname: String
let urlPort: Int
let baseUrl: String
let sonosName: String
let uuid: String
let invisible: Bool
}
let response = try JSONDecoder().decode(Response.self, from: data)
我在 Swift 中收到以下错误:
Failed to load: The data couldn’t be read because it isn’t in the correct format.
有什么建议吗?
【问题讨论】:
-
打印错误,而不是 error.localizedDescription。它将有更多信息。您会看到没有
sonos键。应该只是let sonos = try JSONDecoder().decode([sonosStatus].self, from: data) -
JSON 中的
sonos和status键在哪里?并且名称结构总是以大写字母开头。 -
你从哪里得到错误?是
JSONDecoder().decode抛出的吗? -
谢谢,有帮助。改为 let sonos = try JSONDecoder().decode([sonosStatus].self, from: data)
标签: arrays json swift jsondecoder