2014-01-24 25 views
5

我遇到類似問題,與討論的here類似。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作品(從代碼,我用它來上傳圖片改編)。我知道這是絕對不認可的方式來做到這一點:

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,我很樂意使用它。

謝謝大家!

回答

7

我使用的是POST,所以不涉及查詢字符串。但是,POST數據也可能存在限制?

該限制不在POST上,它是URL表單編碼。我繼續說,你應該編碼爲JSON,你可以做以下配置更改到你的經理:

manager.requestSerializer = [AFJSONRequestSerializer serializer];

此外,除非您實際構建多部分請求,否則請勿使用該方法的constructingBodyWithBlock版本。

+0

我已經這樣做了,但沒有包含在帖子中。應該有,但帖子似乎非常長。我編輯了原始文章以包含它。 感謝您澄清的限制和他們來自哪裏。 那麼,我會如何去上傳我選擇的任何複雜的JSON? – shmim

4

我只是處理了同樣的問題,我能找到的唯一解決方案是從數組中創建一個字典。必須有更好的辦法,這是非常醜陋的......

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

否則一切都變平了。我使用AFJSONRequestSerializer,但這似乎並不重要。

+0

可能是醜陋的,但它的作品,謝謝! – whitelionV

+0

這是在數據必須在url查詢中發送時獲取編碼的最簡單方法 – ZeMoon

0

我最近也有這個問題,我有以下參數發送到服務器,但「功能」數組分成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)]; 

而這個伎倆。我希望這可以幫助某人。