Това са данните от JSON, които получавам от сървъра:
[{
"_id": someRandomID;
comment = {
identifier = someRandomIdentifier;
text = someRandomText;
};
}]
Използвам socket.io
и получавам данните от socket.on()
както е показано по-долу:
socket?.on("add-comment") {data, ack in
print(data)
}
Опитах се да създам клас за него по-долу:
class addComment: Codable {
let _id: String
let comment: comments
}
class comments: Codable {
let identifier: String
let text: String
init(identifier: String, text: String) {
self.identifier = identifier
self.text = text
}
}
и вътре в socket.on добавих следните кодове:
socket?.on("add-comment") {data, ack in
let decoder = JSONDecoder()
let comment = decoder.decode(addComment.self, from: data)
}
Той ми показва следното:
не може да конвертира стойност от тип "[Any]" в очаквания тип аргумент "Data"
Може ли някой, моля ръководство чрез как мога да конвертирате обект на данни, които получавам от сървъра за четене обект в бързо да бъде в състояние да достигне своите стойности?
Отговори:
0 за отговор № 1Добавете квадратни скоби около обекта, който искате да създадете, вашият json е масив от (1) обекти, а не обект.
Опитайте тази:
let comments = decoder.decode([addComment].self, from: data)
(същото име на класа ви като множествено число без начален капитал е доста объркващо)
0 за отговор № 2
Получавате този масив в манипулатора за завършване, data
е не от типа Data
let data : [Any] = [["_id": "someRandomID",
"comment" : ["identifier" : "someRandomIdentifier",
"text" : "someRandomText"]
]
]
Да използвам Codable
трябва да сериализирате масива в JSON
Това са вашите класове, съответстващи на конвенцията за именуване на Swift
class AddComment: Codable {
private enum CodingKeys : String, CodingKey {
case id = "_id", comment
}
let id: String
let comment: Comment
}
class Comment: Codable {
let identifier: String
let text: String
}
И това е начинът да се направи масивът Codable
съвместим
do {
let jsonData = try JSONSerialization.data(withJSONObject: data)
let decoder = JSONDecoder()
let addComments = try decoder.decode([AddComment].self, from: jsonData)
print(addComments[0])
} catch {
print(error)
}