JSON解码无法按预期工作swift 4
如果我想解码我的JSON,就会发生一些奇怪的事情 这是结构图JSON解码无法按预期工作swift 4,json,swift,jsondecoder,Json,Swift,Jsondecoder,如果我想解码我的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
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是
{用户:test,消息:Hello welcome,状态:admin,纬度:0,经度:0}
返回聊天信息用户:test,信息:Hello welcome,状态:admin,纬度:0.0,经度:0.0
但是如果有更多的消息,例如:[用户:用户1,消息:你好欢迎,状态:管理员,纬度:0,经度:0},{用户:用户2,消息:你好欢迎,状态:管理员,纬度:0,经度:0}],我无法让它工作。
其返回的typeMismatchSwift.Dictionary,Swift.DecodingError.ContextcodingPath:[],debugDescription:应解码字典,但找到了一个数组,underlineError:nil
我试过使用chatMessages.self,但没有达到预期效果。
我做错了什么
提前谢谢。答案很简单, 您必须使用以下选项:
let chatMessage1 = try jsonDecoder.decode([chatMessage].self, from: jsonData)
与此相反:
let chatMessage1 = try jsonDecoder.decode(chatMessage.self, from: jsonData)
在loadChats函数中。
因为您有NSDictionary数组。您可以在initdecoder中检测并处理它,但简单的解决方案是这样做
do {
let chatMessage1 = try jsonDecoder.decode(chatMessage.self, from: jsonData)
}
catch {
do {
let chatMessage1 = try jsonDecoder.decode([chatMessage].self, from: jsonData)
}
catch {
print(error)
}
}
此外,我认为最好将后端更改为返回数组anway,即使只有一条消息也不要使用此消息,内容可能是字典或数组,因此这两种情况仍然存在。响应必须是固定结构。所以你根据它来解码。