2011-07-27 204 views
1

我創建PHP的服務器,我調用這個函數在我的目標CJSON解析字符串

public function getCOMPAINs(){ 

     $query = "SELECT COMPAINCOMPAIN_ID FROM COMPAIN_USER WHERE USERUSER_ID = '$this->USER_ID'"; 
      $MyConnection = new MyConnection(); 
     $result = mysql_query($query,$MyConnection->Connection) or die(mysql_error()); 
    while($obj=mysql_fetch_object($result)) { 
     $res[] = array('COMPAIN_ID' => $obj->COMPAINCOMPAIN_ID); 
    } 
    return json_encode($res); 



    } 

,如果我嘗試調用與PHP的這個功能,我可以表明這種反應

array(2) { 
    [0]=> 
    array(1) { 
    ["COMPAIN_ID"]=> 
    string(2) "44" 
    } 
    [1]=> 
    array(1) { 
    ["COMPAIN_ID"]=> 
    string(2) "46" 
    } 
} 

如何可以解析使用JSON這個響應數據?我試圖做到這一點的解決方案,但這種使用帶有XML

- (NSMutableData *)sendRequestCompains{ 

     NSMutableString *sRequest = [[NSMutableString alloc] init]; 
     [sRequest appendString:@"<?xml version=\"1.0\" encoding=\"utf-8\"?>"]; 
     [sRequest appendString:@"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"]; 
     [sRequest appendString:@"<soap:Body>"]; 
     [sRequest appendString:@"<getCOMPAINs xmlns=\"http://tempuri.org/PlatformService/method\">"]; 
     [sRequest appendString:@"<Id_USR>"]; // any attribute 
     [sRequest appendString:@"1"]; // attribute value 
     [sRequest appendString:@"</Id_USR>"]; 
     [sRequest appendString:@"</getCOMPAINs>"]; 
     [sRequest appendString:@"</soap:Body>"]; 
     [sRequest appendString:@"</soap:Envelope>"]; 


     NSURL *ServiceURL = [NSURL URLWithString:@"http://79.249.37.1/server_comp.php"]; 
     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:ServiceURL]; 
     [request addValue:@"text/xml; charset:UTF-8" forHTTPHeaderField:@"Content-Type"]; 
     [request addValue:@"http://79.249.37.1/server_comp.php/getCOMPAINs" forHTTPHeaderField:@"SOAPAction"]; 
     [request setHTTPMethod:@"POST"]; 
     [request setHTTPBody:[sRequest dataUsingEncoding:NSUTF8StringEncoding]]; 
     NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
     if (conn) { 
      data = [[NSData data] retain]; 
      NSLog(@"Connection success"); 
      [NSURLConnection connectionWithRequest:request delegate:self]; 
      NSError *WSerror; 
      NSURLResponse *WSresponse; 

     data = [NSURLConnection sendSynchronousRequest:request returningResponse:&WSresponse error:&WSerror]; 
      NSLog(@"slt%d",[data length]); 
     } 






     return data; 
    } 

我嘗試這個解決方案,但不是活像ķ

NSData * webData=[[NSMutableData alloc] initWithData:self.sendRequestCompains]; 



    // Create new SBJSON parser object 
    SBJSON *parser = [[SBJSON alloc] init]; 



    NSString *json_string = [[NSString alloc] initWithData:webData encoding:NSUTF8StringEncoding]; 

    NSArray *statuses = [parser objectWithString:json_string error:nil]; 

    for (NSDictionary *status in statuses) 
    { 

     NSLog(@"%@", [status objectForKey:@"0"]); 
    } 


    the response recived from server 
<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:getCOMPAINsResponse xmlns:ns1="http://tempuri.org/PlatformService/method"><COMPAIN xsi:type="xsd:string">[{&quot;COMPAIN_ID&quot;:&quot;44&quot;},{&quot;COMPAIN_ID&quot;:&quot;46&quot;}]</COMPAIN></ns1:getCOMPAINsResponse></SOAP-ENV:Body></SOAP-ENV:Envelope> 

我嘗試這個解決方案,但沒有工作

NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL 

URLWithString:@"http://79.249.37.1/server_comp.php/getCOMPAINs.json?userId=1"]];

// execution de la requête et récupération du JSON via un objet 

NSData NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

// On récupère le JSON en NSString depuis la réponse 
    NSString *json_string = [[NSString alloc] initWithData:response 

encoding:NSUTF8StringEncoding];

// on parse la reponse JSON 
    NSArray *statuses = [parser objectWithString:json_string 

error:nil];

for (NSDictionary *status in statuses) 
    { 
     // on peut recuperer les valeurs en utilisant objectForKey à 

partir du status qui est un NSDictionary // on log le tweet et le nom de l utilisateur NSLog(@"%@", [status objectForKey:@"COMPAIN_ID"]); }

+0

請將您的服務器(JSON,而不是PHP pritn_r輸出!)的響應添加到問題中!其中一條評論如下所示:「recive json in xml string」並且毫無意義 - 我們需要更多信息。此 – deanWombourne

+0

的JSON includ響應 [{" COMPAIN_ID ":},{" COMPAIN_ID ":}] –

+0

沒有我的幫助? –

回答

3

您想使用JSON解析響應,但響應被封裝在一些XML中。

你有兩個選擇:

1)解析XML得到JSON,然後解析爲JSON

2)要求服務器不換行的XML您的回覆,只返回JSON 。

您似乎正在用SOAP(來自sendRequestCompains)與服務器交談 - 如果您發出SOAP請求,它將返回一個JSON對象的機會並不多!我認爲你最好的選擇是選項(1)。

但是,如果你有在你的服務器控件我會停止使用SOAP不惜一切,並得到它的迴應像

http://79.249.37.1/server_comp.php/getCOMPAINs.json?Id_USR=1 

我傳遞的paramters一樣網址參數,而不是作爲一個SOAP目的。我還指定我對URL的末尾有10 .json的json響應感興趣。

+0

thx bro我想嘗試選項2,實際上我不想使用XML –

+0

haw我可以讓我的服務器不要在XML中包裝響應,並使用剛纔返回的JSON –

+0

haw我可以讓我的函數getCOMPAINs中的Id_USR = 1? –

0

這一行之前:

NSArray *statuses = [parser objectWithString:json_string error:nil]; 

添加這些行:

json_string = [json_string stringByReplacingOccurancesOfString:@"<?xml version="1.0" encoding="ISO-8859-1"?><SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:getCOMPAINsResponse xmlns:ns1="http://tempuri.org/PlatformService/method"><COMPAIN xsi:type="xsd:string">" withString:@""]; 
json_string = [json_string stringByReplacingOccurancesOfString:@"</COMPAIN></ns1:getCOMPAINsResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>" withString:@""]; 

這是硬編碼的,所以你必須確保這不會改變。

剩下的是什麼是json_string,但與HTML實體編碼。對其進行解碼,將該類添加到您的項目:
https://discussions.apple.com/message/8064367#8064367

而且NSArray *statuses ...前添加另一條線。

json_string = [[[MREntitiesConverter alloc] init] convertEntiesInString:json_string];