2013-05-10 5 views
0

Я принимаю ответ here, но он не работает для меня. Я получаю NULL.Objective-C Json String в PHP Array

Я произвести 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

Вы забыли скопировать строку JSON, заставив $ _POST распаковать ее часть, вы этого не хотите.

Я не знаю, как сделать кодировку URL-адрес в Obj-C, но в 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]' Я не получаю эту часть. –

+0

Потому что вы не кодировали URL. 'NSUTF8StringEncoding' не похож на то, что кодирует URL.Кодированный параметр URL должен выглядеть примерно так: '% 5B% 22sample.pdf% 22% 2C% 20% 22sample.pdf% 22% 5D' – Halcyon

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' действительно печатает правильный результат, позвольте мне проверить это из объективного кода. –