我正在从旧版C ++代码库中导入文件。从技术上讲,该文件本身是JSON,但是在我收到该文件之前,值之一已在C ++代码库中用XOR函数进行了模糊处理。
{"version": 15, "data": "C\u0016Q45\u0010 46QY\\\u0011\n\u0019a\u0003\u0019}\u001apg"}
技术上,“数据”的值是UTF8字符串。
我知道用于将数据解码为可用JSON字符串的算法。但是,显然由于格式问题,我无法迅速将其解析为[String:String]。
Error Domain=NSCocoaErrorDomain Code=3840 "Unable to convert data to string around character 31."
到目前为止,我已经设法通过隔离子数据来获取有问题的特定数据
let encryptedData = data.subdata(in: dataPrefixLength ..< dataLength - 2)
即使如此,当我尝试使用UTF8编码将其解析为String时,我似乎仍然无法迅速将其解析为String。
String(data: encryptedData, encoding: .utf8)
还值得注意的是,在检查数据本身时,调试器中的String描述似乎还不错。
我真的很感谢任何建议。 谢谢!
答案 0 :(得分:2)
从您的示例中可以看出,混淆会生成二进制数据,并将二进制数据放入字符串中。 JSON不允许这样做。因此,它是无效的JSON,任何具有合理验证量的解析器都将拒绝它。
例如,以字符串开头:
"C\u0016
以字符“ C”开头。是有效的。
然后是一个十六进制值的转义字符:0016
。但是,U + 0016不是有效的Unicode代码点。因此,它被拒绝了。可能应该是二进制字节0x16。但是您不能将其放入JSON字符串中。
您有两个选择:
修复数据源,例如通过在将二进制数据放入JSON之前使用Base64编码。
编写您自己的JSON解析器以处理无效的JSON。