Parse JSON response with AFNetworking

后端 未结 4 1340
长情又很酷
长情又很酷 2020-12-09 19:18

I\'ve setup a JSON post with AFNetworking in Objective-C and am sending data to a server with the following code:

AFHTTPRequestOperationManager          


        
相关标签:
4条回答
  • 2020-12-09 19:54

    I find it works best to subclass AFHTTPClient like so:

    //  MyHTTPClient.h
    
    #import <AFNetworking/AFHTTPClient.h>
    
    @interface MyHTTPClient : AFHTTPClient
    
    + (instancetype)sharedClient;
    
    @end
    
    //  MyHTTPClient.m
    
    #import "MyHTTPClient.h"
    
    #import <AFNetworking/AFJSONRequestOperation.h>
    
    static NSString *kBaseUrl = @"http://api.blah.com/yada/v1/";
    
    @implementation MyHTTPClient
    
    + (instancetype)sharedClient {
        static id instance;
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            instance = [[self alloc] init];
        });
        return instance;
    }
    
    - (id)init {
        if (self = [super initWithBaseURL:[NSURL URLWithString:kBaseUrl]]) {
            self.parameterEncoding = AFJSONParameterEncoding;
    
            [self setDefaultHeader:@"Accept" value:@"application/json"]; // So AFJSONRequestOperation becomes eligible for requests.
            [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; // So that it gets used for postPath etc.
        }
        return self;
    }
    
    @end
    

    The important bits are:

    • Setting the 'Accept' in such a way that AFJSONRequestOperation becomes eligible.
    • Adding AFJSONRequestOperation to the http operation classes.

    Then you can use it like so:

    #import "MyHTTPClient.h"
    
    @implementation UserService
    
    + (void)createUserWithEmail:(NSString *)email completion:(CreateUserCompletion)completion {
        NSDictionary *params = @{@"email": email};
        [[MyHTTPClient sharedClient] postPath:@"user" parameters:params success:^(AFHTTPRequestOperation *operation, NSDictionary *responseObject) {
            completion([responseObject[@"userId"] intValue], YES);
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            completion(0, NO);
        }];
    }
    
    @end
    

    The beauty of this is that your responseObject is automatically JSON-parsed into a dictionary (or array) for you. Very clean.

    (this is for afnetworking 1.x)

    0 讨论(0)
  • 2020-12-09 20:06

    In this case, when the web service responds with JSON, the AFNetworking will do the serialization for you and the responseObject will most likely be either a NSArray or NSDictionary object.

    Such an object should be more useful for you than string with JSON content.

    0 讨论(0)
  • 2020-12-09 20:07

    responseObject is either an NSArray or NSDictionary. You can check at runtime using isKindOfClass::

    if ([responseObject isKindOfClass:[NSArray class]]) {
        NSArray *responseArray = responseObject;
        /* do something with responseArray */
    } else if ([responseObject isKindOfClass:[NSDictionary class]]) {
        NSDictionary *responseDict = responseObject;
        /* do something with responseDict */
    }
    

    If you really need the string of the JSON, it's available by looking at operation.responseString.

    0 讨论(0)
  • 2020-12-09 20:13

    In my case, it's looks like (maybe it can helps)

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    [manager POST:url parameters:params
          success:^(AFHTTPRequestOperation *operation, id responseObject) {
              NSDictionary *jsonDict = (NSDictionary *) responseObject;
              //!!! here is answer (parsed from mapped JSON: {"result":"STRING"}) ->
              NSString *res = [NSString stringWithFormat:@"%@", [jsonDict objectForKey:@"result"]];
          } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
              //....
          }
     ];
    

    Also would be great to check type of response object (like https://stackoverflow.com/a/21962445/3628317 answer)

    0 讨论(0)
提交回复
热议问题