【问题标题】:iOS Swift Json Serialization breaking on strings with a returniOS Swift Json 序列化在返回的字符串上中断
【发布时间】:2015-10-20 11:26:20
【问题描述】:

如果我返回带有/不带空格的“测试”,它会起作用。但是,当我返回用户使用字符串中的 return 存储的值时,它会失败并返回 nil 错误,但是当我查看 NSLog 时,该值就在那里......

失败前的代码

var url:NSURL = NSURL(string:PassURL)!
    var postData:NSData = post.dataUsingEncoding(NSASCIIStringEncoding)!

    var postLength:NSString = String( postData.length )

    var request:NSMutableURLRequest = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "POST"
    request.HTTPBody = postData
    request.setValue(postLength as String, forHTTPHeaderField: "Content-Length")
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.setValue("application/json", forHTTPHeaderField: "Accept")


    var reponseError: NSError?
    var response: NSURLResponse?

    var urlData: NSData? = NSURLConnection.sendSynchronousRequest(request, returningResponse:&response, error:&reponseError)

    if ( urlData != nil ) {
        let res = response as! NSHTTPURLResponse!;

        NSLog("Response code: %ld", res.statusCode);

        if (res.statusCode >= 200 && res.statusCode < 300)
        {
            var responseData:NSString  = NSString(data:urlData!, encoding:NSUTF8StringEncoding)!

            NSLog("Response ==> %@", responseData);

            var error: NSError?

//FAILS HERE
let jsonData:NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as! NSDictionary

NSLog

2015-07-29 08:52:26.622 testApp[20648:187508] Response ==> {"success":1, "test": "Going to Return Now
Second Line"}
fatal error: unexpectedly found nil while unwrapping an Optional value

但是值不为零...

NSError

Optional(Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (Unescaped control character around character 41.) UserInfo=0x7f9c9942b050 {NSDebugDescription=Unescaped control character around character 41.})

未转义的字符就是return,怎么让json接受呢?

【问题讨论】:

  • 请添加更多内核
  • @AshishKakkad 刚刚在失败前添加了更多代码
  • 发生这种情况的原因是您的字符串通过解析器返回 nil。您可以将urlData 变量作为字符串发布吗?
  • @theMonster 我无法输入 urlstring 但我得到了 NSError ---------> Optional(Error Domain=NSCocoaErrorDomain Code=3840 "操作无法完成。(Cocoa错误 3840.)"(字符 24 周围未转义的控制字符。)UserInfo=0x7f9c9942b050 {NSDebugDescription=字符 41 周围的未转义控制字符。})
  • 尝试让 jsonData:NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options:nil , error: &error) 为! NSDictionary

标签: ios json swift


【解决方案1】:

由于您无法从 URLRequest 中发布实际字符串,因此我无法确切地说明它有什么问题。但它听起来像字符没有。 24 和 41 不符合 JSON。

我会评论:json.org。并将其粘贴到:jsonlint.com 这将为您提供更多细节。并找出您的端点返回无效 JSON 的原因。

如果您想处理返回 nil 的 NSJSONSerialization,只需将其包装在 if let 中:

if let jsonData:NSDictionary = NSJSONSerialization.JSONObjectWithData(urlData!, options:NSJSONReadingOptions.MutableContainers , error: &error) as? NSDictionary {
    /* It's a valid JSON object */
} else {
    /* It's not a valid JSON object */
}

注意:在 json 的根目录下有一个数组,不处理。如果你想处理它,只需扩展一个 else if let as? NSArray。此外,如果 urlData 为 nil,这将崩溃,因为我们仍在强制展开它。

【讨论】:

  • 字符是回车。我需要找到一种方法来处理它,有什么建议吗?
  • 他们是在 JSON 序列化中解析字符串返回的一种方式吗?还是我的请求无法通过 JSON?
  • 如果我的字符串包含返回,允许它并且不要将其标记为未转义的字符串
  • 我不认为你可以通过NSJSONSerialization 做到这一点。但是,您可以只使用字符串函数来查找/替换文本。
【解决方案2】:
var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary

var error:NSError? = nil

var jsonResult = NSJSONSerialization.JSONObjectWithData(data, options:nil, error: &error) as? NSDictionary

【讨论】:

  • 答案的第二部分有效,但随后打破了这一点--->让成功:NSInteger = jsonData!.valueForKey("success") as! NSInteger
  • 说成功是零,但价值在那里
猜你喜欢
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多