2

私はAFNetworkingを初めて使用し、次のようなjsonを返す単純なログインAPIを呼び出しています。

{"status":"success","data":{"auth_token":"12jt34"}}

私は次の方法でそれを行っていますが、操作できるものではなく、__NSCFDataを返しています。

NSURL *baseURL = [NSURL URLWithString:@"http://localhost:3000/arc/v1/api/"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
[httpClient defaultValueForHeader:@"Accept"];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                        uname,@"email", pwd, @"password",
                        nil];
[httpClient postPath:@"login-mobile" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *className = NSStringFromClass([responseObject class]);
    NSLog(@"val: %@",className);
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error retrieving data: %@", error);
}];

そしてそれは出力します:

2013-03-21 14:52:51.290 FbTabbed[21505:11303] val: __NSCFData

でも、それを操作できる辞書にしたいと思います。私は何が間違っているのですか?

4

3 に答える 3

5
[httpClient defaultValueForHeader:@"Accept"];

次のようにする必要があります。

[httpClient setDefaultHeader:@"Accept" value:@"application/json"];
于 2013-03-21T22:15:07.393 に答える
2

はい、responseObjectですNSDataNSJSONSerialization次に、 methodを使用して辞書または配列に解析できますJSONObjectWithData

NSURL *baseURL = [NSURL URLWithString:@"http://localhost:3000/arc/v1/api/"];
AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:baseURL];
[httpClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
[httpClient defaultValueForHeader:@"Accept"];
NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys:
                        uname,@"email", pwd, @"password",
                        nil];
[httpClient postPath:@"login-mobile" parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSAssert([responseObject isKindOfClass:[NSData class]], @"responseObject is supposed to be a NSData"); // it should be a NSData class

    NSError *error;
    self.results = [NSJSONSerialization JSONObjectWithData:responseObject
                                                   options:0
                                                     error:&error];
    if (error != nil)
    {
        // handle the error

        // an example of the sort of error that could result in a parse error 
        // is if common issue is that certain server errors can result in an
        // HTML error page (e.g. you have the URL wrong, your server will 
        // deliver a HTML 404 page not found page). If you want to look at the 
        // contents of the `responseObject`, you would:
        //
        // NSLog(@"responseObject=%@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);
    }
}failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error retrieving data: %@", error);
}];

明らかに、API から取得する応答のタイプに応じて、resultsオブジェクトはNSDictionaryまたはになります。NSArray

于 2013-03-21T22:19:25.160 に答える
0

私は何を間違っていますか?

NSStringFromClass()オブジェクトとして渡したクラスの名前を返しNSStringます。

返された JSON 文字列から辞書を作成する場合は、NSJSONSerializationクラスを使用するなどして解析する必要があります。

于 2013-03-21T22:04:20.823 に答える