1

我一直在用头撞墙。

我有一个将 JSON 返回到我的 iOS 应用程序的 Rails 后端。我正在使用 rails 的默认返回来自动为我呈现 JSON 中的对象。我在处理它返回的错误时遇到了麻烦。

我得到的错误 JSON 是{"errors":{"email":["can't be blank"],"password":["can't be blank"]}}.

我使用 ASI 来处理请求。

-(void) requestFinished:(ASIFormDataRequest *)request {
  NSDictionary *data = [[request responseString] JSONValue];

执行上述代码使数据变为:

{
  errors =     
  {
    email =         (
        "can't be blank"
    );
    password =         (
        "can't be blank"
    );
  };
}

现在这给了我试图解析它的问题。我希望能够访问错误的每个元素及其相关值。

当我尝试遍历元素时,我会执行以下操作:

for (NSDictionary *error in [data objectForKey:@"errors"])

这会给我emailpassword,但它们是类型__NSCFString,不是NSDictionary。我一直无法找到获取电子邮件或密码值的方法。有谁知道如何解析这个?

谢谢!

4

2 回答 2

1

好吧,我Mac现在没有,但如果它不起作用,我会尽力帮助你,让我知道我明天会更正它。

-(void) requestFinished:(ASIFormDataRequest *)request 
 {
     NSArray *data = [[request responseString] JSONValue];
     NSDictionary *dict = [data objectAtIndex:0];

     NSDictionary *dict2 = [dict valueForKey:@"errors"];

     NSLog(@"email = %@, password = %@",[dict2 valueForKey:@"email"], [dict2 valueForKey:@"password"]);
 }
于 2012-10-03T18:17:52.770 回答
1

这应该有效,请注意响应与您的“数据”NSDictionary 具有相同的结构。

NSDictionary *fields = [[NSDictionary alloc] initWithObjectsAndKeys: [[NSArray alloc] initWithObjects:@"one", @"two", nil],
                                                                @"A",
                                                                [[NSArray alloc] initWithObjects:@"three", @"four", nil],
                                                                @"B",
                                                                nil];

NSDictionary *response = [[NSDictionary alloc] initWithObjectsAndKeys:fields, @"errors", nil];

NSLog(@"Dictionary: %@", [response objectForKey:@"errors"]);


for (NSString *field in [response objectForKey:@"errors"])
    for (NSString* error in [response valueForKeyPath:[NSString stringWithFormat:@"errors.%@", field]])
        NSLog(@"%@ %@", field, error);

输出将如下所示:

Dictionary: {
A =     (
    one,
    two
);
B =     (
    three,
    four
);
}

A one
A two
B three
B four
于 2012-10-03T19:05:00.117 回答