iOS解析JSON问题

时间:2012-10-03 17:48:11

标签: json ios5

我一直在墙上砸了一下。

我有一个rails后端,它将JSON返回到我的iOS应用程序。我正在使用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。我无法找到获取电子邮件或密码值的方法。有没有人知道如何解析这个?

谢谢!

2 个答案:

答案 0 :(得分: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"]);
 }

答案 1 :(得分: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