带有未知UTF8“ ...”字符的Swift 4 JSON字符串无法转换为数据/字典

时间:2018-09-26 15:35:22

标签: json swift

编辑:我能够将问题归结为一个更加集中的领域。尽管这里的帖子不一定是假设错误的,但是Swift 4 base64 String to Data not working due to special character更为清晰,并有一个Playground示例。

我有一个必须在Swift 4中序列化为Dictionary的字符串。该应用程序允许用户上传数据(JSON序列化为Data)并在以后下载。对于后者,该应用程序对下载的数据(dlData)执行以下操作

if let rootDict = NSKeyedUnarchiver.unarchiveObject(with: dlData) as? Dictionary<String, Any> {
    if let content = rootDict["C"] as? String {
        if let data = content.data(using: .utf8, allowLossyConversion: true){
            let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:Any]
             ...
        } else {
            print("DATA DIDNT WORK") //gets printed with his data
    }

几乎每次都运行良好,但是最近有用户联系我,他的iPhone上没有任何数据显示。我添加了else路径,这就是它的去向。似乎无法将此特定字符串转换为Data

当我print()字符串时,复制控制台输出,然后将其硬编码到方法中,就可以了。该字符串是有效的JSON(使用3个不同的在线验证器进行了验证),并且JSONSerialization也可以使用。 / p>

我认为问题可能出在Xcode控制台“清理”其中可能包含的字符串和“不良”字符,这就是为什么复制粘贴使其起作用但直接下载却不起作用的原因。我可以在print()字符串中看到的唯一奇怪的东西是replacement character(符号。)。

print()

这不是执行此任务的最佳方法,但我无权更改此系统的基础结构。而且由于它确实适用于至少95%的用户,因此我认为它应该适用于所有用户。

我尝试做dlData > rootDict > content > data > json Data > Dictionary > string > Data > Dictionary ,但这不会影响字符串,可能是因为在实际的字符串中,它不是“?”,而是其他内容,而“?”仅会显示,因为控制台不会不知道该怎么放。

我遇到过这个博客https://natrajbontha.wordpress.com/2017/10/12/replacement-character-in-json-data/,但实际上我更喜欢仅在转换已经失败一次的情况下进行清理。

此位置的原始字符是美国国旗表情符号,我的用户可以在没有最新表情符号的情况下生活,但总的来说,我希望显示表情符号,因此替换所有这些表情符号是不可行的。

我刚刚在Playground中尝试了相同的操作,结果也一样。

replacingOccurrences(of: "�", with: "?")

0 个答案:

没有答案