JSON Decode не работает должным образом Swift 4
Если я хочу расшифровать мой JSON, происходит что-то странное.
Вот структуры
struct chatMessages : Codable {
var message: [chatMessage]
}
struct chatMessage : Codable {
var user: String
var message: String
var status: String
var latitude: Double
var longitude: Double
init(from decoder: Decoder) throws {
let values = try decoder.container(keyedBy: CodingKeys.self)
user = try values.decode(String.self, forKey: .user)
message = try values.decode(String.self, forKey: .message)
status = try values.decode(String.self, forKey: .status)
latitude = try values.decodeIfPresent(Double.self, forKey: .latitude) ?? 0.0
longitude = try values.decodeIfPresent(Double.self, forKey: .longitude) ?? 0.0
}
}
И здесь функция
func loadChats() {
print("Try to load chats...")
do {
let jsonData = W.getDataAsData(chatURL)
print(jsonData)
print(String.init(data: jsonData, encoding: .utf8)!)
print("-----------")
let jsonDecoder = JSONDecoder()
let chatMessage1 = try jsonDecoder.decode(chatMessage.self, from: jsonData)
print(chatMessage1)
}
catch {
print("Something went wrong")
print("\(error)")
}
}
если возвращенный JSON{"user":"test","message":"Hello welcome","status":"admin","latitude":0,"longitude":0}
,
его возвращение chatMessage(user: "test", message: "Hello welcome", status: "admin", latitude: 0.0, longitude: 0.0)
но если есть больше сообщений, например, [{"user":"user1","message":"Hello welcome","status":"admin","latitude":0,"longitude":0},{"user":"user2","message":"Hello welcome","status":"admin","latitude":0,"longitude":0}]
Я не могу заставить его работать. Его возвращение typeMismatch(Swift.Dictionary<Swift.String, Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Dictionary<String, Any> but found an array instead.", underlyingError: nil))
Я пробовал с chatMessages.self
но это не так, как ожидалось. Что я делаю неправильно?
Заранее спасибо.
2 ответа
Вы можете обнаружить это внутри init(decoder)
и справиться с этим, но простое решение состоит в том, чтобы сделать это
do {
let chatMessage1 = try jsonDecoder.decode(chatMessage.self, from: jsonData)
}
catch {
do {
let chatMessage1 = try jsonDecoder.decode([chatMessage].self, from: jsonData)
}
catch {
print(error)
}
}
Кроме того, я думаю, что лучше всего изменить свой бэкэнд, чтобы он возвращал массив, даже если есть только одно сообщение
Ответ очень прост, вы должны использовать это:
let chatMessage1 = try jsonDecoder.decode([chatMessage].self, from: jsonData)
вместо этого:
let chatMessage1 = try jsonDecoder.decode(chatMessage.self, from: jsonData)
в функции loadChats(). потому что у вас есть массив NSDictionary.