2013-05-10 126 views
0

我正在接受的答案here但它不適用於我。我得到NULLObjective-C Json字符串到PHP數組

我產生JSON從陣列:

NSError* error; 
    NSData *result =[NSJSONSerialization dataWithJSONObject:self.fileNamesListForUpload options:0 error:&error]; 
    NSString *displayJson = [[NSString alloc] initWithData:result 
              encoding:NSUTF8StringEncoding]; 
    NSLog(@"json result %@",displayJson); 

此打印["sample.pdf","sample-1.pdf"]然後我使用下面的命令發佈字符串

捲曲-F 「名稱列表= [」 sample.pdf 「」 sample-1.pdf「]」url

在我的php代碼中;

//get json string 
    $jsonString = $_POST["nameList"]; 
    var_dump($_POST["nameList"]); 
    $arrayOfNames=json_decode($jsonString,true); 
    var_dump($arrayOfNames); 
    echo "ArrayOfNames: ",$arrayOfNames,"\n"; 

結果是;

string(25) "[sample.pdf,sample-1.pdf]" 
NULL 
ArrayOfNames: 

或者如果我加引號''我得到;

string(27) "'[sample.pdf,sample-1.pdf]'" 
NULL 

爲什麼「」在我使用_POST時被解僱? [sample.pdf,sample-1.pdf]我發佈了["sample.pdf","sample-1.pdf"]

如何解析json字符串並將其放入數組?

回答

0

我最終得到安寧向上_POST請求並使用此;

$handle = fopen('php://input','r'); 
$jsonInput = fgets($handle); 
$decoded = json_decode($jsonInput,true); 


sendResponse(200, json_encode($decoded)); 
在Objective-C部分

NSError* error; 
    NSData *result =[NSJSONSerialization dataWithJSONObject:self.fileNamesListForUpload options:0 error:&error]; 
    NSString *displayJson = [[NSString alloc] initWithData:result 
              encoding:NSUTF8StringEncoding]; 
    NSLog(@"json result %@",displayJson); 


    if ([self.fileNamesListForUpload count]>=1) { 
     //send file upload request here 
     NSURL* url = [NSURL URLWithString:deleteExtraFilesIn]; 
     __weak ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 


     [request addRequestHeader:@"User-Agent" value:@"ASIHTTPRequest"]; 
     [request addRequestHeader:@"Content-Type" value:@"application/json"]; 
     [request appendPostData:[displayJson dataUsingEncoding:NSUTF8StringEncoding]]; 


     [request setCompletionBlock:^ 
     { 
      if (request.responseStatusCode == 200) { 

      //succesfully inserted row 
       NSError* error; 
       NSString *responseString = [request responseString]; 
       NSDictionary* json =  [NSJSONSerialization JSONObjectWithData: [responseString dataUsingEncoding:NSUTF8StringEncoding] 
                      options: NSJSONReadingMutableContainers 
                      error: &error]; 

       NSLog(@"recieved dict %@",json); 


      } 
}]; 

     [request setFailedBlock:^ 
     { 
      //NEED RETURN FALSE 
      //hide progress hud 
     }]; 

     //start sync 
     [request setDelegate:self]; 
     [request startAsynchronous]; 
    } 
0

您忘記了urlencode導致$ _POST解壓部分的JSON字符串,您不需要這樣做。

我不知道該怎麼做的OBJ - C的URL編碼,但在PHP是:

"nameList=" . urlencode($json_string); 

然後$_POST["nameList"]應包含字符串["sample.pdf", "sample.pdf"],並且可以json_decode這一點。

+0

實際上我使用編碼'編碼:NSUTF8StringEncoding'我更新的代碼,但問題是這樣的字符串'[ 「sample.pdf」,「樣品1 .pdf「]'通過_POST接收到這個'[sample.pdf,sample-1.pdf]'我沒有那部分。 – 2013-05-10 14:42:04

+0

因爲你沒有做URL編碼。 'NSUTF8StringEncoding'聽起來不像是URL編碼的東西。URL編碼的參數應該如下所示:'%5B%22sample.pdf%22%2C%20%22sample.pdf%22%5D' – Halcyon 2013-05-10 15:30:53

2

如果您發送的請求爲curl -F "nameList=["sample.pdf","sample-1.pdf"]" url

var_dump($_POST["nameList"])將返回string(25) "[sample.pdf,sample-1.pdf]"

如果您發送的curl -F 'nameList=["sample.pdf","sample-1.pdf"]' url

var_dump($_POST["nameList"])將返回string(33) "[\"sample.pdf\",\"sample-1.pdf\"]"

您可以使用第二個選項並從字符串中刪除反斜槓。

<?php 
    $jsonString = $_POST["nameList"]; 
    var_dump($jsonString); 
    $jsonString = str_replace("\\", "", $jsonString); 
    var_dump($jsonString); 
    $arrayOfNames=json_decode($jsonString,true); 
    var_dump($arrayOfNames); 
?> 

Objective-C的側:

NSData *jsonArray =[NSJSONSerialization dataWithJSONObject:@[@"sample.pdf", @"sample-1.pdf"] options:0 error:nil]; 
NSString *stringFromJsonArray = [[NSString alloc] initWithData:jsonArray encoding:NSUTF8StringEncoding]; 
NSLog(@"%@", stringFromJsonArray); //["sample.pdf","sample-1.pdf"] 

NSString *requestString = [NSString stringWithFormat:@"nameList=%@", stringFromJsonArray]; 
NSLog(@"%@", requestString); //nameList=["sample.pdf","sample-1.pdf"] 

NSURL *url = [NSURL URLWithString:@"http://127.0.0.1/t.php"]; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 
[request setHTTPMethod:@"POST"]; 
[request setHTTPBody:[requestString dataUsingEncoding:NSUTF8StringEncoding]]; 
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; 
NSString *responseString = [[NSString alloc] initWithBytes:responseData.bytes length:responseData.length encoding:NSUTF8StringEncoding]; 
NSLog(@"%@", responseString); 
/* 
string(33) "[\"sample.pdf\",\"sample-1.pdf\"]" 
string(29) "["sample.pdf","sample-1.pdf"]" 
array(2) { 
    [0]=> 
    string(10) "sample.pdf" 
    [1]=> 
    string(12) "sample-1.pdf" 
} */ 
+0

+1將此放在一起,'curl -F'nameList = [「sample。 pdf「,」sample-1.pdf「]'url'確實打印出正確的結果,讓我從客觀的代碼中進行測試。 – 2013-05-10 16:47:50