无法从服务中读取JSON

时间:2012-05-09 10:57:43

标签: objective-c ios json nsdictionary nsdata

我正在实施忘记密码服务,我会在其中传递一个电子邮件地址,它将返回JSON以确认已发送的电子邮件。问题是我无法在json中读取响应字符串,并且我的异常消息显示数据参数为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

4 个答案:

答案 0 :(得分:3)

Objective-C中的

异常仅用于致命错误,不能用于可恢复的错误。而只是检查零数据:

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

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的基本区别。

答案 1 :(得分:1)

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

此外,即使它只是您请求的小文件,我也会寻求异步请求,以免阻止用户界面。

答案 2 :(得分:1)

我遇到了同样的问题,问题是我在url字符串中给了额外的空间url string @“http:....”通过删除url字符串@“https:”开头的空格来纠正它......“

答案 3 :(得分:0)

通过修复服务网址解决了这个问题,我的网址没有编码,内联空格