UTF-8 проблема кодировки JSONSerialization - PullRequest
0 голосов
/ 19 октября 2018

Я пытался конвертировать 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 или другой платформой.

1 Ответ

0 голосов
/ 19 октября 2018

Результат на отлично.Это внутреннее строковое представление - наследие до Unicode - массива или словаря, когда вы print it.

Присвойте значения метке или текстовому представлению, и вы увидите ожидаемые символы.

...