如何在 iOS 中获取 JSON 响应?获得零值?

Posted

技术标签:

【中文标题】如何在 iOS 中获取 JSON 响应?获得零值?【英文标题】:How to get JSON response in iOS? Getting nil value? 【发布时间】:2013-10-09 20:07:19 【问题描述】:

我正在将数据从 php api 发送到我的 ios 应用程序。

在获取JSON 响应时遇到问题。

这是我试图得到响应的代码。

@interface CPDScatterPlotViewController ()

    NSURLConnection *conGet;

@end

@implementation CPDScatterPlotViewController
@synthesize responseData;


- (void)viewDidLoad

    [super viewDidLoad];

    NSLog(@"viewdidload");
     self.responseData = [NSMutableData data];
    NSURLRequest *request = [NSURLRequest requestWithURL:
                             [NSURL URLWithString:@"http://localhost/testApi/test_api.php?method=hello"]];

 conGet =[[NSURLConnection alloc] initWithRequest:request delegate:self];

    NSLog(@"Request sent");

    NSString* responseString = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding] ;

    NSLog(@"Response String: %@", responseString);
    NSLog(@"val : %@ ", responseData);





- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
    NSLog(@"didReceiveResponse");
    [self.responseData setLength:0];


- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
    [self.responseData appendData:data];


- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
    NSLog(@"didFailWithError");
    NSLog([NSString stringWithFormat:@"Connection failed: %@", [error description]]);


- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
    NSLog(@"connectionDidFinishLoading");
    NSLog(@"Succeeded! Received %d bytes of data",[self.responseData length]);

    // convert to JSON
    NSError *myError = nil;
    NSDictionary *res = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:&myError];

    // show all values
    for(id key in res) 

        id value = [res objectForKey:key];

        NSString *keyAsString = (NSString *)key;
        NSString *valueAsString = (NSString *)value;

        NSLog(@"key: %@", keyAsString);
        NSLog(@"value: %@", valueAsString);
    

    // extract specific value...
    NSArray *results = [res objectForKey:@"results"];

    for (NSDictionary *result in results) 
        NSString *icon = [result objectForKey:@"icon"];
        NSLog(@"icon: %@", icon);
    


但是当我运行这段代码时,我得到了异常。

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'data parameter is nil'

这是我的 API 文件

<?php>
function deliver_response($format, $api_response)

// Define HTTP responses
    $http_response_code = array(
        200 => 'OK',
        400 => 'Bad Request',
        401 => 'Unauthorized',
        403 => 'Forbidden',
        404 => 'Not Found'
    );
// Set HTTP Response
    header('HTTP/1.1 ' . $api_response['status'] . ' ' . $http_response_code[$api_response['status']]);
// Process different content types
    if (strcasecmp($format, 'json') == 0)
    
// Set HTTP Response Content Type
        header('Content-Type: application/json; charset=utf-8');
// Format data into a JSON response
        $json_response = json_encode($api_response);
// Deliver formatted data
        echo $json_response;
    
    elseif (strcasecmp($format, 'xml') == 0)
    
// Set HTTP Response Content Type
        header('Content-Type: application/xml; charset=utf-8');
// Format data into an XML response (This is only good at handling string data, not arrays)
        $xml_response = '<?xml version="1.0" encoding="UTF-8"?>' . "\n" .
                '<response>' . "\n" .
                "\t" . '<code>' . $api_response['code'] . '</code>' . "\n" .
                "\t" . '<data>' . $api_response['data'] . '</data>' . "\n" .
                '</response>';
// Deliver formatted data
        echo $xml_response;
    
    else
    
// Set HTTP Response Content Type (This is only good at handling string data, not arrays)
        header('Content-Type: text/html; charset=utf-8');
// Deliver formatted data
        echo $api_response['data'];
    
// End script process
    exit;


//////////My SQL Connection
// Create connection
$con = mysqli_connect("", "root", "", "test_db");

// Check connection
if (mysqli_connect_errno($con))

    echo "Failed to connect to MySQL: " . mysqli_connect_error();


$result = mysqli_query($con, "SELECT count(*) FROM test_table");

//$count = $result->num_rows;

// Define whether an HTTPS connection is required
$HTTPS_required = FALSE;
// Define whether user authentication is required
$authentication_required = FALSE;
// Define API response codes and their related HTTP response
$api_response_code = array(
    0 => array('HTTP Response' => 400, 'Message' => 'Unknown Error'),
    1 => array('HTTP Response' => 200, 'Message' => 'Success'),
    2 => array('HTTP Response' => 403, 'Message' => 'HTTPS Required'),
    3 => array('HTTP Response' => 401, 'Message' => 'Authentication Required'),
    4 => array('HTTP Response' => 401, 'Message' => 'Authentication Failed'),
    5 => array('HTTP Response' => 404, 'Message' => 'Invalid Request'),
    6 => array('HTTP Response' => 400, 'Message' => 'Invalid Response Format')
);
// Set default HTTP response of 'ok'
$response['code'] = 0;
$response['status'] = 404;
$response['data'] = NULL;
// --- Step 2: Authorization
// Optionally require connections to be made via HTTPS
if ($HTTPS_required && $_SERVER['HTTPS'] != 'on')

    $response['code'] = 2;
    $response['status'] = $api_response_code[$response['code']]['HTTP Response'];
    $response['data'] = $api_response_code[$response['code']]['Message'];


// Return Response to browser. This will exit the script.
    deliver_response($_GET['format'], $response);

// Optionally require user authentication
if ($authentication_required)


    if (empty($_POST['username']) || empty($_POST['password']))
    
        $response['code'] = 3;
        $response['status'] = $api_response_code[$response['code']]['HTTP Response'];
        $response['data'] = $api_response_code[$response['code']]['Message'];
    
// Return an error response if user fails authentication. This is a very simplistic example
// that should be modified for security in a production environment
    elseif ($_POST['username'] != 'foo' && $_POST['password'] != 'bar')
    
        $response['code'] = 4;
        $response['status'] = $api_response_code[$response['code']]['HTTP Response'];
        $response['data'] = $api_response_code[$response['code']]['Message'];
    

// --- Step 3: Process Request
// Method A: Say Hello to the API
//$_GET['method'] = 'hello';
if (strcasecmp($_GET['method'], 'hello') == 0)

    $response['code'] = 1;
    $response['status'] = $api_response_code[$response['code']]['HTTP Response'];

    $row = $result->fetch_row();
   // echo $row[0];
    $response['data'] = $row[0];   

// --- Step 4: Deliver Response
// Return Response to browser
deliver_response("json", $response);
?>

如果我运行这个 Api,它会在网页上显示 8346 的记录。

【问题讨论】:

【参考方案1】:

对代码进行这些更改。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
        NSLog(@"connectionDidFinishLoading");
        NSLog(@"Succeeded! Received %d bytes of data",[self.responseData length]);
        NSString *strr = [[NSString alloc] initWithData:self.responseData encoding:NSUTF8StringEncoding];
        NSLog(@"data is: %@",self.responseData);

    //NSDictionary *dict = [[NSDictionary alloc] initwithd]


    // convert to JSON

    NSError *e = nil;
    NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: _responseData options:NSJSONReadingMutableContainers error:&e];

    NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:self.responseData options:NSJSONReadingMutableLeaves error:nil];
    NSLog(@"data -- %@",[dict objectForKey:@"data"]);
    if (!jsonArray) 
        NSLog(@"Error parsing JSON: %@", e);
     

【讨论】:

【参考方案2】:

就我而言,我用过这个

 NSString* urlString=[NSString stringWithFormat:@“%@“,myURLwithKeyAndValue];
    urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];


    NSData * results = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];

    NSLog(@"Result  = %@",results);

    if (results)
    

        messageDataDict = [NSJSONSerialization JSONObjectWithData: results options: NSJSONReadingMutableContainers error: nil];

    

【讨论】:

以上是关于如何在 iOS 中获取 JSON 响应?获得零值?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 iOS 中的字典中获取值

如何使用 POST 方法在颤振中获得 json 响应?

如何在 yii 中以 json 格式(应用程序/json)获得响应?

如何在android中获得这个Json响应?我在服务器上获得大量数据,所以我想过滤它

PHP:如何从 JSON 中获取变量(从 Swift iOS 应用程序发送)并以 JSON 响应

如何在angular2应用程序中获取JSON数组响应数据