struct Chat: Codable, Identifiable {
let id = UUID()
var Messages: [Messages]
}
class ChatApi: ObservableObject{
@Published var chats = Chat()
func loadData(completion:@escaping (Chat) -> ()) {
let urlString = prefixUrl+"/room"
let url = NSURL(string: urlString as String)!
var request = URLRequest(url: url as URL)
request.setValue(accessKey, forHTTPHeaderField: "X-Access-Key-Id")
request.setValue(secretkey, forHTTPHeaderField: "X-Access-Key-Secret")
URLSession.shared.dataTask(with: request) { data, response, error in
let chats = try! JSONDecoder().decode(Chat.self, from: data!)
print(chats)
DispatchQueue.main.async {
completion(chats)
}
}.resume()
}
}
Ich kann die folgende JSON-Antwort nicht mit Swift decodieren.
{
"Messages": [
{...}
]
}
Ich habe die oben genannten Möglichkeiten ausprobiert und Xcode gibt weiterhin Fehler aus. Obwohl ich in der Lage bin, die JSON-Antwort mit einer anderen Funktion zu decodieren, die so ist
[
{...},
{...},
{...}
]
Ich kann JSON-Antworten decodieren, die als Arrays, aber nicht als Wörterbücher zurückgegeben werden.
Beispielantwort zum Dekodieren
{
"Messages": [
{
"_id": "MS4mMbTXok8g",
"_created_at": "2022-04-05T10:58:54Z",
"_created_by": {
"_id": "Us123",
"Name": "John Doe",
},
"_modified_at": "2022-04-05T10:58:54Z",
"Type": "Message",
"_raw_content": "ss",
"RoomId": "Ro1234",
},
{
"_id": "MS4m3oYXadUV",
"_created_at": "2022-04-04T15:22:21Z",
"_created_by": {
"_id": "Us678",
"Name": "Jim Lane",
},
"_modified_at": "2022-04-04T15:22:21Z",
"Type": "Message",
"_raw_content": "ss",
"RoomId": "Ro1234",
}
]
}
Das Datenmodell, das ich verwendet habe, ist
struct CreatedBy: Codable {
var _id: String
var Name: String
}
struct Messages: Codable {
var _id: String
var _created_by: CreatedBy?
var `Type`: String?
var _raw_content: String
}
struct Chat: Codable, Identifiable {
let id = UUID()
var Messages: [Messages]
}
Die Fehlermeldung vor dem Kompilieren lautetEditor placeholder in source file
Lösung des Problems
Ich werde Ihnen einige Websites vorstellen, die Ihnen beim Umgang mit der JSON-Decodierung helfen: JSON Formatter & Validator und Quicktype. Der erste stellt sicher, dass der JSON, mit dem Sie arbeiten, tatsächlich gültig ist, und formatiert ihn in eine für Menschen lesbare Form. Die zweite schreibt diese tatsächlichen dekodierbaren Strukturen. Diese sind nicht perfekt, und Sie möchten sie vielleicht bearbeiten, aber sie erledigen die Arbeit, während Sie lernen.
Sobald Sie Ihr Datenmodell gepostet haben, konnte ich das Problem sehen. Eine Ihrer Variablen ist:
var `Type`: String?
Der Compiler sieht das ` und denkt, es sei ein Platzhalter. Sie können sie nicht im Code verwenden.
Auch, obwohl kein Code gepostet wird, bin ich mir nicht sicher, ob Sie machen müssen Chat
Identifiable
, im Gegensatz zu Messages
denen, die sein könnten, aber nicht sind. Identifiable
Ich würde wechseln oder zumindest hinzufügen Messages
. Ich habe auch gemacht, CreatedBy
Identifiable
da es auch ein Unikat hat id
.
Die andere Sache, die Ihnen fehlt, um Ihren Code lesbarer zu machen, ist eine CodingKeys
Aufzählung. Dadurch werden die Schlüssel von dem, was Sie in JSON erhalten, in das übersetzt, was Ihre Variablen tatsächlich sein sollen. Ich habe Ihr JSON durch die oben genannten Seiten laufen lassen, und das ist dabei herausgekommen:
// MARK: - Chat
struct Chat: Codable {
let messages: [Message]
enum CodingKeys: String, CodingKey {
case messages = "Messages"
}
}
// MARK: - Message
struct Message: Codable, Identifiable {
let id: String
let createdAt: Date
let createdBy: CreatedBy
let modifiedAt: Date
let type, rawContent, roomID: String
enum CodingKeys: String, CodingKey {
case id = "_id"
case createdAt = "_created_at"
case createdBy = "_created_by"
case modifiedAt = "_modified_at"
case type = "Type"
case rawContent = "_raw_content"
case roomID = "RoomId"
}
}
// MARK: - CreatedBy
struct CreatedBy: Codable, Identifiable {
let id, name: String
enum CodingKeys: String, CodingKey {
case id = "_id"
case name = "Name"
}
}
Dadurch erhalten Sie herkömmliche Swift-Variablen im Gegensatz zu dem Schlangenfall, den Ihnen JSON gibt. Probieren Sie dies in Ihrem Code aus und teilen Sie uns mit, wenn Sie weitere Probleme haben.
Keine Kommentare:
Kommentar veröffentlichen