JSONSerialization的UTF-8编码问题

时间:2018-10-19 10:07:50

标签: swift encoding nsjsonserialization

我试图在Swift中将struct转换为Dictionary。这是我的代码:

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
    }

}

这在大多数情况下都有效。但是,当我尝试转换包含Unicode字符(例如中文)的嵌套结构时,发生了这种情况:

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 :(得分:0)

结果非常好。 print就是数组或字典的内部字符串表示形式(Unicode之前的传统)。

将值分配给标签或文本视图,您将看到预期的字符。