【问题标题】:Not able to read JSON from service无法从服务中读取 JSON
【发布时间】:2012-05-09 10:57:43
【问题描述】:

我正在实施忘记密码服务,在该服务中我将传递一个电子邮件地址,它会返回 JSON 以确认已发送的电子邮件。问题是我无法读取 json 中的响应字符串,并且我的异常消息显示 data 参数为 nil,但是如果我在 Web 浏览器中查看 url,则服务看起来很好,如下所述。 我的代码是:

NSURL *url = [LokalmotionCommonTask getURLForgotPassword:emailFieldTxt.text];

    NSData* data = [NSData dataWithContentsOfURL: url];

    @try {
        NSError* error;
        NSDictionary* jsonDict = [NSJSONSerialization 
                                  JSONObjectWithData:data //1
                                  options:0 
                                  error:&error];

        NSLog(@"%@", [jsonDict objectForKey:@"response"]);
    }
    @catch (NSException *exception) {
        NSLog(@"forgot password exception: %@: %@", [exception name], [exception reason]);
    }

我在网络浏览器中得到的服务响应是这样的:

{"status":400,"response":"Your request to change password is already sent. Please check your email."}

例外:

forgot password exception: NSInvalidArgumentException: data parameter is nil

【问题讨论】:

  • 它到底在哪里“崩溃”了?
  • 它读取行是哪个jsonDict被实例化然后抛出异常
  • 好了,数据为零。
  • 但正如您在服务响应中看到的,它确实包含一个字符串

标签: objective-c ios json nsdictionary nsdata


【解决方案1】:

在 Objective-C 中,异常仅用于致命错误,而不是可恢复的错误。相反,只需检查 nil 数据:

如果您需要知道失败的原因,请使用:

NSError* error;
NSURL *url = [LokalmotionCommonTask getURLForgotPassword:emailFieldTxt.text];
NSData* data = [NSData dataWithContentsOfURL: url options:NULL error:&error];
if (data) {
    NSDictionary* jsonDict = [NSJSONSerialization 
                              JSONObjectWithData:data //1
                              options:0 
                              error:&error];
    NSLog(@"%@", [jsonDict objectForKey:@"response"]);
}
else {
    NSLog(@"forgot password error, %@", [error localizedFailureReason]);
}

存在命名约定错误:getURLForgotPassword:
以“get”开头的方法名称意味着将有一个按引用返回的参数。最好只命名方法:forgotPasswordURL:

get 前缀的异常和访问器这两个东西是和 Jave 的一个基本区别。

【讨论】:

  • 仍然为空。是不是因为服务响应不符合标准?比如'response'可以直接包含一个字符串还是应该包含一个项目数组?
  • NSLog() url 并验证它。请参阅我更新的示例代码以及错误消息。另外,请考虑更改您的问题,以表明所提供的响应消息是您所期望的,而不是您收到的,它现在的方式令人困惑。
  • 更改无效。我想在 NSDictionary 中得到响应,但它没有得到,而是得到 null,这就是问题,仍然令人困惑?
  • NSLog() url 并验证它。
  • 由于程序员错误而引发异常。从外部传入的数据不会有例外处理。您不会捕获异常。当异常发生时,您知道代码中存在错误,并且您修复了该错误。在这种情况下,将 nil 传递给 JSON 解析器是程序员错误。不要捕捉异常,只是一开始就不要这样做。
【解决方案2】:

有错误说data parameter is nil。因此,您为 JSON 日期传递的变量可能是 nil
[NSData dataWithContentsOfURL:url] 可能会返回 nil,因为发生错误。尝试记录。

此外,即使它只是您请求的一个小文件,我也会进行异步请求,以免阻塞 UI。

【讨论】:

  • 我已经提到了上面的响应及其价值两个值。
  • 你怎么知道它的样子?你NSLog了吗?
  • 我在我的网络浏览器中看到了它,问题是当我从我的网络浏览器中看到它时没问题,但是 NSData 正在为空
  • 所以你实际上并没有提到你在 iOS 上得到的响应。尝试记录您为获取数据而传递的 url。
  • 您能否发布记录的内容以及创建 URL 的代码?
【解决方案3】:

我遇到了同样的问题,问题是我在 url 字符串中给出了额外的空间,即 url 字符串 @"http:...." 通过删除 url 字符串开头的空格 @"https: ……”

【讨论】:

  • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。
  • 但是我遇到了与这个问题完全相同的问题,这对我有帮助,这是由于 url 字符串开头有多余的空间,你可以试试。
【解决方案4】:

通过修复服务 URL 解决了我的 url 没有编码并且内联有空格

【讨论】:

    猜你喜欢
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 2021-12-08
    相关资源
    最近更新 更多