AFNetworking将JSON数组作为多个单项词典发布

我遇到了类似于这里讨论的问题 。

我试图将JSON发布到服务器。

这是应该工作的Objective-C代码,但不是。 我在响应对象中得到一个空数组,不知道为什么:

AFHTTPRequestOperation * operation = [manager POST:uploadScriptUrl parameters:mutableJSON success:^(AFHTTPRequestOperation * operation, id responseObject) { successBlock(operation, responseObject); } failure:^(AFHTTPRequestOperation * operation, NSError * error) { failureBlock(operation, error); }]; 

这个代码(从我用来上传图片的代码改编而来) KIND OF作品。 我知道这绝对不是批准的方式:

  AFHTTPRequestOperationManager * manager = [AFHTTPRequestOperationManager manager]; AFJSONRequestSerializer * requestSerializer = [AFJSONRequestSerializer serializer]; [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; manager.requestSerializer = requestSerializer; AFHTTPRequestOperation * operation = [manager POST:uploadScriptUrl parameters:mutableJSON //passed in constructingBodyWithBlock:^(id <AFMultipartFormData> formData) { //Do nothing } success:^(AFHTTPRequestOperation * operation, id responseObject) { successBlock(operation, responseObject); } failure:^(AFHTTPRequestOperation * operation, NSError * error) { failureBlock(operation, error); }]; 

它将我的JSON发布到服务器,但在制定请求的过程中,JSON被破坏。

以下是它的开始:

 { "key1": [ { "dictionary1": { "param1": "value1", "param2": "value2", "array1A": [ "value1", "value2" ], "array1B": [ "value1", "value2" ] } } ] 

}

以下是AFNetworking发送给服务器的信息:

 { "key1": [ { "dictionary1": { "array1A": [ "value1" ] } }, { "dictionary1": { "array1A": [ "value2" ] } }, { "dictionary1": { "array1B": [ "value1" ] } }, { "dictionary1": { "array1B": [ "value2" ] } }, { "dictionary1": { "param1": "value1" } }, { "dictionary1": { "param2": "value2" } } ] 

}

这是查尔斯为这个请求所performance的。 在服务器触及数据之前,您可以看到JSON结构在请求中是如何被改变的。

这里是我在服务器上使用的PHP。 现在很简单:

 <?php header('Content-type: application/json'); //Not sure if this is needed. $json_string = json_encode($_POST); header("HTTP/1.0 200 OK"); echo $json_string; ?> 

所以,所有这一切说,这是我的问题:

  1. AFNetworking是否处理嵌套的JSON数组? 在这个页面 Mattt说:“你所描述的结构不能确定性地用查询string编码表示。 我使用POST,所以查询string不涉及。 但是,POST数据也可能存在限制?

  2. 我也很好奇,为什么包含constructingBodyWithBlock BodyWithBlock的较长的AFNetworking调用成功,而较短的失败。 但是,这个答案对我来说不那么重要。 更长的方法几乎可以工作,如果它返回了我发送的相同的JSON,我很乐意使用它。

谢谢大家!

我使用POST,所以查询string不涉及。 但是,POST数据也可能存在限制?

限制不在POST上,它是URL表单编码。 我继续说,你应该编码为JSON,你可以做以下configuration更改给你的经理:

manager.requestSerializer = [AFJSONRequestSerializer serializer];

另外,除非实际构build多部分请求,否则不要使用该方法的constructingBodyWithBlock版本。

我只是处理了同样的问题,我能find的唯一解决scheme是从数组中创build一个字典。 必须有更好的方法,这是非常丑陋的…

  NSMutableDictionary *arrayDict = [[NSMutableDictionary alloc] init]; int counter = 0; for (NSMutableDictionary *arrayItem in arrayToSend) { [arrayDict setObject:arrayItem forKey:[NSNumber numberWithInt:counter]]; counter++; } 

否则一切都变平了。 我使用AFJSONRequestSerializer,但这似乎并不重要。

丑陋的解决scheme是为弱思想: 如何在NSDictionary内张贴一个NSDray的NSArray没有问题?

这篇文章的答案包含了你所需要的。

我最近也有这个问题,我有以下参数发送到服务器,但“function”数组分为4部分,而不是只有2个字典。

  { "description": "Temporary Description", "name": "Product Name", "feature": [ { "fkey": "FT1", "fvalue": "FD1" }, { "fkey": "FT2", "fvalue": "FD2" } ] } 

所以我改变了

AFURLRequestSerialisation.m

AFQueryStringPairsFromKeyAndValue(NSString *key, id value)方法中replace了这一行

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

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

这就是诀窍。 我希望这可以帮助某人。