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

时间:2014-01-24 23:51:32

标签: php ios objective-c afnetworking afnetworking-2

我遇到与here讨论的问题类似的问题。

我正在尝试将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"
        }
    }
]

}

这是查尔斯为请求显示的内容。在服务器触摸数据之前,您可以看到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数组?在this page Mattt说:“你所描述的结构无法通过查询字符串编码来确定。”我正在使用POST,因此不涉及查询字符串。但也许POST数据存在限制?

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

  3. 谢谢大家!

4 个答案:

答案 0 :(得分:7)

  

我正在使用POST,因此不涉及查询字符串。但也许POST数据存在限制?

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

manager.requestSerializer = [AFJSONRequestSerializer serializer];

此外,除非您实际构建多部分请求,否则请勿使用该方法的constructingBodyWithBlock版本。

答案 1 :(得分:4)

我刚刚处理了同样的问题,我能找到的唯一解决方案就是从数组中创建一个字典。一定有更好的方法,这很难看......

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

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

答案 2 :(得分:0)

丑陋的解决方案适合弱势群体: How can I POST an NSArray of NSDictionaries inside an NSDictionary without problems?

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

答案 3 :(得分:0)

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

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

所以我改变了

  

AFURLRequestSerialisation.m

AFQueryStringPairsFromKeyAndValue(NSString *key, id value)方法

中替换了这一行
[mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];

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

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