Я пытался конвертировать struct
в Dictionary
в Swift.Это был мой код:
extension Encodable {
var dictionary: [String: Any]? {
if let data = try? JSONEncoder().encode(self) {
if let dict = try? JSONSerialization.jsonObject(with: data) as? [String: Any] {
return dict
}
return nil
}
return nil
}
}
Это работает в большинстве случаев.Но когда я пытаюсь преобразовать вложенную структуру, которая содержит символы Юникода, такие как китайский, это произошло:
struct PersonModel: Codable {
var job: String?
var contacts: [ContactSimpleModel]
var manager: ManagerSimpleModel?
}
struct ContactSimpleModel: Codable {
var relation: String
var name: String
}
struct ManagerSimpleModel: Codable {
var name: String
var age: Int
}
let contact1 = ContactSimpleModel(relation: "朋友", name: "宙斯")
let contact2 = ContactSimpleModel(relation: "同学", name: "奥丁")
let manager = ManagerSimpleModel(name: "拉斐尔", age: 31)
let job = "火枪手"
let person = PersonModel(job: job, contacts: [contact1, contact2], manager: manager)
if let dict = person.dictionary {
print(dict)
}
Результат этого кода такой:
["contacts": <__NSArrayI 0x600002471980>(
{
name = "\U5b99\U65af";
relation = "\U670b\U53cb";
},
{
name = "\U5965\U4e01";
relation = "\U540c\U5b66";
}
)
, "manager": {
age = 31;
name = "\U62c9\U6590\U5c14";
}, "job": 火枪手]
Вы можете увидетьрезультат.Китайские символы в этих вложенных структурах стали строкой кодирования utf-8.Свойство верхнего уровня "job": 火枪手
верно.Но значения в этих вложенных структурах не были исходной строкой.
Это ошибка JSONSerialization
?Или как сделать это правильно?
Больше информации.Я использовал результат, подобный следующему:
var sortedQuery = ""
if let dict = person.dictionary {
sortedQuery = dict.sorted(by: {$0.0 < $1.0})
.map({ "\($0)\($1)" })
.joined(separator: "")
}
Он использовался для проверки правильности запроса.Результат не совпадает с Java или другой платформой.