的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的任何问题或者我的代码的问题。
好了,你需要做的,是固定在文件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)];
精湛的答案兄弟。我很惊讶,为什么这个答案是不能接受的,但你应该解释更 – pankaj
老兄,你刚才救了我:)一天,我只花了我半天了这个问题。谢谢一吨 –
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类如上所述,然后开始工作,我们想要的方式。
如何使用这个?我需要做的请求与以下格式, [ { “路径”: “/”, “值”:{ “状态”: “ACTIVE” }, “OP”: “替换” } ] 你能解释更多吗?向我显示您的使用代码.. – karthikeyan
@karthikeyan我的请求类似于[{},{},{}]格式。正如我在答复中提到我已经更换的NSArray * AFQueryStringPairsFromKeyAndValue(的NSString *键,值id)这个方法地雷 – pankaj
@karthikeyan如果你还在寻找解决方案,那么你可以告诉我。我可以尝试给你编辑AFNetworking框架 – pankaj
这里'的NSDictionary * FinalData的= [NSDictionary的dictionaryWithObject:arrayDictionary forKey:@ “细节”];'什么'arrayDictionary'? –
@katre,我编辑了我的查询。这是“partyArray” – Vaz
我遇到了同样的问题,瓦兹,你找到了解决办法? –