解析 JSON 时出错“字符 981 周围未转义的控制字符”

问题描述 投票:0回答:5

错误域=NSCocoaErrorDomain代码=3840“未转义的控制字符
字符 981 左右。” UserInfo={NSDebugDescription=未转义的控制
字符 981 周围的字符。}

我在响应请求时收到上述错误。

以下是代码行:

Alamofire.request(.POST, urlStr, parameters: parameter, encoding: .JSON, headers: nil).validate().responseJSON {
    response in switch response.result {

        case .Success(let JSON):
            completionHandler(JSON as! NSDictionary)

        case.Failure(let Error):

            print(Error)
    }
}

它在 Postman 中给出 JSON 响应。

我在邮递员中得到的回复:

{
  "orderdetails": {
    "status_code": "200",
    "status_message": "Order details",
    "billingandshipping": {
      "billing": {
        "firstname": "first",
        "lastname": "last",
        "email": "[email protected]",
        "address": "dasdesfrew",
        "city": "Rajkot",
        "area": "University Road",
        "pincode": "360003",
        "phone": "1234567890",
        "mobileno": "1234567891"
      },
      "shipping": {
        "firstname": "first",
        "lastname": "last",
        "email": "[email protected]",
        "address": "dasdesfrew",
        "city": "dasdesfrew",
        "area": "dcdc",
        "pincode": "360003",
        "phone": "1234567890",
        "mobileno": "1234567891"
      }
    },
    "orders": [
      {
        "order_id": "77",
        "order_date": "09-08-2016 13:05:29",
        "delivery_date": "10-08-2016",
        "order_items": [
          {
            "Sr": "1",
            "product_name": "Lemon",
            "gujtitle": "લીંબુ ",
            "product_code": "000057",
            "product_price": "108.00",
            "product_qty": "2",
            "unit": "1 kg.",
            "product_total": "216"
          }
        ],
        "final_total": "216.00",
        "shipping_cost": "0.00",
        "order_total": "216.00",
        "discount_type": "null",
        "discount_amount": "null",
        "coupon_name": "null",
        "comment": "gdhdj\nfghd.g\nghj\n\n\n\n\n\n\n\n\n\n.."
      }
    ]
  }
}
ios json swift alamofire
5个回答
20
投票

据您所知,存在与“ ”.

所以我建议您可以添加“”,这对您有用,如下所示:

” ”=>“\n”

因为这是一个特殊字符,称为退格字符。


5
投票

自 Swift 5 起,您无需手动将另一个

\
添加到 JSON 字符串中有效的
\n
中,只需使用以下语法将其声明为原始字符串文字:

let jsonString = #"{"comment": "gdhdj\nfghd.g\nghj\n\n\n\n\n\n\n\n\n\n.."}"#

多行也可以工作:

let jsonString = #"""
{
  "comment": "gdhdj\nfghd.g\nghj\n\n\n\n\n\n\n\n\n\n.."
}
"""#

请注意,使用

#
进行包装至关重要 - 虽然多行示例在没有它的情况下也可以 compile 正常,但在 runtime 中,它会在下面的 JSONSerialization 示例中抛出错误:

do {
    guard let data = jsonString.data(using: .utf8) else { throw SomeError() }
    let obj = try JSONSerialization.jsonObject(with: data)
    print("valid!")
} catch {
    print(error)
}

2
投票

NSLog 你收到的 NSData 并看看你在字节 981 附近发现了什么。未转义的控制字符的问题是它们是不可见的,所以你不能在 NSString 中看到它们,但你会在 NSData 中看到它们。

如果您的数据长度为 981 字节或非常接近,那么您的代码有可能处理不完整的 JSON 数据,这几乎总是会失败;这是you需要解决的问题。如果某些项目之间(例如两个数组元素之间)存在控制字符,那么这可能是服务器代码中的错误。


1
投票

我花了一些时间才弄清楚 49546 是什么。 如果您的问题是 字符 49546 周围未转义的控制字符,请将

\t
替换为
\\\t


1
投票

可以肯定的是(当人们进行错误的复制/粘贴时......),我构建我的对象是安全的:

...

private final func fillWith(
     id: Int,
     name: String?
) {

    self.id = id
    self.productName = name?.replacingOccurrences(of: "\t", with: "")
    self.productName = self.productName?.replacingOccurrences(of: "\n", with: "")

所以发送up时没有问题。

© www.soinside.com 2019 - 2024. All rights reserved.