1

しばらく壁に頭をぶつけていました。

JSON を iOS アプリに返す Rails バックエンドがあります。オブジェクトをJSONで自動的にレンダリングするために、Railsのデフォルトの戻り値を使用しています。返されるエラーに問題があります。

エラーに対して取得する 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"])

これによりemailandが得られますpasswordが、タイプ__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 に答える