如何在没有问题的情况下在NSDictionary中发布NSArray NSArray?

时间:2015-05-21 21:25:34

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

我知道怎么做,这很简单。

问题在于它无法正常工作。

这是我用来POST数据的功能:

- (void)updateWebsitesUsingParameters:(NSDictionary *)parameters;
{
    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    [manager POST:@"http://notreal/updateWebsites.php"
       parameters:parameters
          success:^(AFHTTPRequestOperation *operation, id responseObject) {

              NSLog(@"JSON: %@", responseObject);

              //...
          }
          failure:^(AFHTTPRequestOperation *operation, NSError *error) {

              //...
          }];
}

以下是参数:

NSDictionary *parameters = @{@"type" : @"0",
                             @"credentials" : @{@"email" : @"notreal@gmail.com", @"password" : @"notreal"},
                             @"device" : @{@"ID" : @"8588107756600540", @"numberOfSessions" : @"0", @"name" : @"Nick's iMac"},
                             @"websites" : @[@{@"title" : @"Google", @"URL" : @"http://www.google.com"}, @{@"title" : @"Yahoo", @"URL" : @"http://www.yahoo.com"}]};

这是在MySQL字段中保存的内容:

[{URL = "http://www.google.com";},{title = Google;},{URL = "http://www.yahoo.com";},{title = Yahoo;}]

这太疯狂了!

  1. 我已经在MySQL字段内​​的字典中成功保存了多个属性的字典数组的JSON - 或简称我在这里尝试做的 - 使用PHP用于不同目的的脚本,它没有问题。
  2. 我使用相同的PHP代码将其保存到MySQL字段,因此IT'不是PHP' S FAULT。
  3. 我使用AFNetworking完成的所有其他保存/检索功能。
  4. 这有效:

    @[@{@"title" : @"Google"}, @{@"title" : @"Yahoo"}]
    

    这不是:

    @[@{@"title" : @"Google", @"URL" : @"http://www.google.com"}, @{@"title" : @"Yahoo", @"URL" : @"http://www.yahoo.com"}]
    

    以下是回复:

    {
        websites =     (
                    {
                URL = "http://www.google.com";
            },
                    {
                title = Google;
            },
                    {
                URL = "http://www.yahoo.com";
            },
                    {
                title = Yahoo;
            }
        );
    }
    

    INSANE!

    出于某种原因,如果我添加一个额外的属性,它就会崩溃。

    这必须是 AFNetworking 错误,因为它毫无意义。

    编辑:

    我可以:

    1. 制作两个MySQL字段:websiteTitles,websiteURLs。

    2. 将其保存为一个字符串:" Google; http://www.google.com"然后将其分开,但这违背了使用JSON的目的。

    3. 将参数切成两半:websteTitles,websiteURLs

    4. 一切都是丑陋的,有什么想法吗?

      编辑2:

      我做了几个测试:

      如果数组有1个或2个项目,它仍然表现得像这样无关紧要。

      我尝试了 rob180 建议的内容 - 以及 - 预计 - 它的AFNetwokring错误:

      {
          websites =     (
                      {
                  URL = "http://www.google.com";
              },
                      {
                  title = Google;
              },
                      {
                  URL = "http://www.yahoo.com";
              },
                      {
                  title = Yahoo;
              }
          );
      }
      

      这是从应用程序发送的内容的实际服务器响应,中间没有mysql。

      编辑3:

      REQUEST: <NSMutableURLRequest: 0x7f9352d467e0> { URL: http://notreal/updateWebsites.php }
      

      HTTPBody 如下所示:

      <63726564 656e7469 616c735b ... 653d30>
      

      我该如何解码?

      另外,我使用 AFHTTPRequestSerializer 。也许,如果我将其更改为 AFJSONRequestSerializer ,它将解决问题,但我真的不想,因为我已经用这种方式编写了很多方法。

3 个答案:

答案 0 :(得分:3)

&#34;查询字符串参数化根本不是编码嵌套数据结构的可靠方法。这就是为什么所有现代Web框架都具有内置的便利,可以自动将传入的JSON解码为参数。&#34; - Mattt Thompson

所以, JSON 是......

参数:

NSDictionary *parameters = @{@"websites" : @[@{@"Title" : @"Google", @"URL" : @"http://www.google.com"}, @{@"Title" : @"Yahoo", @"URL" : @"http://www.yahoo.com"}]};

发送:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    manager.responseSerializer = [AFJSONResponseSerializer serializer];

    [manager POST:@"http://server/path/file.php"
       parameters:parameters
          success:^(NSURLSessionDataTask *task, id responseObject) {

              NSLog(@"JSON: %@", responseObject);
          }
          failure:^(NSURLSessionDataTask *task, NSError *error) {

              NSLog(@"Error: %@", error.description);
          }];

提取:

<?php

header('Content-type: application/json');

$request = json_decode(file_get_contents('php://input'), TRUE);

$response = ["URLOfTheSecondWebsite" => $request['websites'][1]['URL']];

echo json_encode($response);

?>

响应:

{
    URL = "http://yahoo.com";
}

全部完成!

纯金。

答案 1 :(得分:2)

更新功能AFQueryStringPairsFromKeyAndValue

变化

     for (id nestedValue in array) {
         [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[]", key], nestedValue)];
     }

     int i = 0;
     for (id nestedValue in array) {
         [mutableQueryStringComponents addObjectsFromArray:AFQueryStringPairsFromKeyAndValue([NSString stringWithFormat:@"%@[%d]", key, i++], nestedValue)];
     }

答案 2 :(得分:0)

AFHTTPSessionManager有同样的问题。 不幸的是,您必须切换到AFJSONRequestSerializer才能发送字典数组:

manager.requestSerializer = [AFJSONRequestSerializer serializer];

AFJSONRequestSerializer设置 application / json 内容类型和服务器,期望JSON成功接受请求参数,而AFHTTPRequestSerializer将始终具有 text / html 即使您明确设置了内容,也会在标题中输入内容。