【问题标题】:Read JSON Error from HTTPCookie in Swift not working从 Swift 中的 HTTPCookie 读取 JSON 错误不起作用
【发布时间】:2016-10-28 12:46:41
【问题描述】:

我正在尝试从 http cookie 中读取字符串序列化的 json 对象。字符串看起来像这样

"{\"status\": 400\054 \"code\": \"14040\"\054 \"links\": {\"self\": \"\"}\054 \"title\": \"Conflicting Email\"}"

所以其中有 unicode 实体,例如:\054 这只是一个逗号 ,

当我尝试将字符串转换为这样的 json 对象时

if let data = cookieValue.data(using: .ascii) {
    do {
        let obj = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String : AnyObject]
        // print("Successfull: \(obj)")
    } catch let error as NSError {
        // print("Cannot convert data to json: \(data)\nError: \(error)")
    }
}

它返回一个错误说:

Error: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Invalid escape sequence around character 17.) UserInfo=0x78e586c0 {NSDebugDescription=Invalid escape sequence around character 17.}

第 17 个字符是\054 的位置。

如何将 unicode 实体转换为文本?

【问题讨论】:

  • 是编码 Unicode 还是 ASCII?它们可能对相同的字符有一些共同的代码,但它们是不同的编码。
  • 另外,\054 不是被解析为<null-char>54 吗?像 "\" 只转义 0
  • 闻起来像 JavaScript 字符串文字转义。在 JS 中,\0 可以是空字符,也可以是 1-3 位八进制转义的一部分。八进制 0o54 是十进制 44 是 ASCII 逗号。八进制转义令人困惑且无用,这就是为什么它们(实际上是空转义)不是 JSON 标准的一部分。为什么 cookie 创建代码可能决定 JS-string-literal-escape 一个已经编码的 JSON 值是神秘的,但由于没有标准方法将任意字符编码到 cookie 中,他们可能会做任何疯狂的事情。 .

标签: json swift unicode


【解决方案1】:

试试

var str2 = str.replacingOccurrences(of: "\054", with: ",")

这对我有用,这是我用于测试的代码。

import Foundation

var str = "{\"status\": 400\054 \"code\": \"14040\"\054 \"links\": {\"self\": \"\"}\054 \"title\": \"Conflicting Email\"}"

var str2 = str.replacingOccurrences(of: "\054", with: ",")

let data = str2.data(using: String.Encoding.utf8, allowLossyConversion: false)!

do {
    let json = try JSONSerialization.jsonObject(with: data, options: []) as! [String: AnyObject]
    for (key, value) in json {
        print(key)
    }
} catch let error as NSError {
    print("Failed to load: \(error.localizedDescription)")
}

【讨论】:

  • 在仅转义逗号的特定情况下,这可能是一种解决方案。但我正在寻找正确的方法来解码八进制转义字符。
猜你喜欢
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 2012-09-18
  • 1970-01-01
相关资源
最近更新 更多