的NSDictionary与NSArray的使用AfNetworking 2

问题描述:

NSDictionary *partyOne = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithInt:2], @"type", 
           [NSNumber numberWithInt:1], @"status", 
           @"name", @"name", 
           @"name", @"nid", 
           @"name", @"nationality", 
           @"", @"address", 
           @"name", @"mobile", 
           nil]; 

    NSDictionary *partyTwo = [NSDictionary dictionaryWithObjectsAndKeys: 
           [NSNumber numberWithInt:2], @"type", 
           [NSNumber numberWithInt:1], @"status", 
           @"name", @"name", 
           @"name", @"nid", 
           @"name", @"nationality", 
           @"", @"address", 
           @"name", @"mobile", 
           nil]; 


    NSArray *partyArray = [NSArray arrayWithObjects: partyOne, partyTwo, nil]; 

    NSDictionary *finalData =[NSDictionary dictionaryWithObject: partyArray forKey:@"details"]; 

转换元件的阵列,同时发布的数据PHP当我发送上面的NSDictionary以如下PHP AFNetworking 2,的NSDictionary与NSArray的使用AfNetworking 2

// Send the data to server 
    NSDictionary *regDic = [self generteJasonData]; 

    // Send the registered data to server 
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
    [manager.requestSerializer setAuthorizationHeaderFieldWithUsername:userName password:userpassWd]; 
    manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
    [manager setShouldUseCredentialStorage:NO]; 

    NSMutableURLRequest *request = [manager.requestSerializer requestWithMethod:@"POST" URLString:@"http://testlink/submit"parameters:regDic]; 
    [request setHTTPShouldHandleCookies:NO]; 

    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; 
    AFJSONResponseSerializer *serializer = [AFJSONResponseSerializer serializer]; 
    [operation setResponseSerializer:serializer ]; 
    [operation setShouldUseCredentialStorage:NO]; 
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"Success: %@", responseObject); 
     [manager.requestSerializer clearAuthorizationHeader]; 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Failure: %@ responce :%@", error,operation.responseString); 
     [manager.requestSerializer clearAuthorizationHeader]; 
     [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"upload", @"")                       message:NSLocalizedString(@"Some error occureed while uploading data, please tryagain later", @"") 
                 delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
     [alert show]; 


    }]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 
    [operation start]; 

我收到它在我的php服务器为,

details =    (
           { 
        address = ""; 
       }, 
           { 
        mobile = name; 
       }, 
           { 
        name = name; 
       }, 
           { 
        nationality = name; 
       }, 
           { 
        nid = name; 
       }, 
           { 
        status = 1; 
       }, 
           { 
        type = 2; 
       }, 
           { 
        address = ""; 
       },   { 
        mobile = name; 
       },   { 
        name = name; 
       }, 
           { 
        nationality = name; 
       }, 
           { 
        nid = name; 
       }, 
         { 
        status = 1; 
       }, 
           { 
        type = 2; 
       }, 
      ); 

即我有发送2个数组元素,但我收到它的许多数组元素。 任何人都可以让我知道这里有什么问题。是他们AFNetworking 2.0 API的任何问题或者我的代码的问题。

+1

这里'的NSDictionary * FinalData的= [NSDictionary的dictionaryWithObject:arrayDictionary forKey:@ “细节”];'什么'arrayDictionary'? –

+0

@katre,我编辑了我的查询。这是“partyArray” – Vaz

+0

我遇到了同样的问题,瓦兹,你找到了解决办法? –

好了,你需要做的,是固定在文件AFURLRequestSerialization.m方法

NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) 

:中 代替

for (id nestedValue in array) 

使其

for (int i = 0;i < [array count];++i) 

,然后代替

[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)]; 

使其

[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[%d]", key,i], nestedValue)]; 
+0

精湛的答案兄弟。我很惊讶,为什么这个答案是不能接受的,但你应该解释更 – pankaj

+0

老兄,你刚才救了我:)一天,我只花了我半天了这个问题。谢谢一吨 –

AFNetworking 2.0:我用@gilad答案,修改它一下,使其正常工作。所以我所做的是写在下面:

NSArray * AFQueryStringPairsFromKeyAndValue(NSString *key, id value) { 
    NSMutableArray *mutableQueryStringComponents = [NSMutableArray array]; 

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"description" ascending:YES selector:@selector(compare:)]; 

    if ([value isKindOfClass:[NSDictionary class]]) { 
    NSDictionary *dictionary = value; 
    // Sort dictionary keys to ensure consistent ordering in query string, which is important when deserializing potentially ambiguous sequences, such as an array of dictionaries 
    for (id nestedKey in [dictionary.allKeys sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { 
     id nestedValue = [dictionary objectForKey:nestedKey]; 
     if (nestedValue) { 
      [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue((key ? [NSString stringWithFormat:@"%@[%@]", key, nestedKey] : nestedKey), nestedValue)]; 
     } 
    } 
    } else if ([value isKindOfClass:[NSArray class]]) { 

    // This is modified by me 
    NSArray *array = value; 
    int i = 0; 
    for (id nestedValue in array) { 
    // A check has been added for NSDictionary 
     if ([nestedValue isKindOfClass:[NSDictionary class]]) { 
      //Here i used @gilad's answer 
      [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[%d]", key,i], nestedValue)]; 

     }else{ 

     [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)]; 
     } 
     i++; 
    } 
    } else if ([value isKindOfClass:[NSSet class]]) { 
     NSSet *set = value; 
     for (id obj in [set sortedArrayUsingDescriptors:@[ sortDescriptor ]]) { 
      [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue(key, obj)]; 
     } 
    } else { 
     [mutableQueryStringComponents addObject:[[AFQueryStringPair alloc] initWithField:key value:value]]; 
    } 

    return mutableQueryStringComponents; 
} 

我刚才编辑的AFQueryStringPairsFromKeyAndValue在AFURLRequestSerialization.m类如上所述,然后开始工作,我们想要的方式。

+0

如何使用这个?我需要做的请求与以下格式, [ { “路径”: “/”, “值”:{ “状态”: “ACTIVE” }, “OP”: “替换” } ] 你能解释更多吗?向我显示您的使用代码.. – karthikeyan

+0

@karthikeyan我的请求类似于[{},{},{}]格式。正如我在答复中提到我已经更换的NSArray * AFQueryStringPairsFromKeyAndValue(的NSString *键,值id)这个方法地雷 – pankaj

+0

@karthikeyan如果你还在寻找解决方案,那么你可以告诉我。我可以尝试给你编辑AFNetworking框架 – pankaj