ios json在使用include()时不起作用

Posted

技术标签:

【中文标题】ios json在使用include()时不起作用【英文标题】:ios json not working when using include() 【发布时间】:2014-02-12 16:24:50 【问题描述】:

我有一个应用程序接收由我的 jason.php 脚本生成的 JSON 文件,并在表格视图中显示数据。

在我尝试在我的 jason.php 文件中使用 'include(db_connect.php)' 将数据库登录详细信息传递给它之前,它工作正常。

使用 'include(db_connect.php)' 运行我的 php 脚本,可以在浏览器中工作(返回格式正确的 JSON 文件)但它不能在我的手机上工作。

但是..

如果我只是将 db_connect.php 的内容粘贴到 jason.php 文件中,它确实可以在我的手机上运行......它会在浏览器中返回完全相同的 JSON 文件。

两种方式在浏览器中返回完全相同的 JSON 文本。

应用程序所做的只是希望从指定的 URL 接收 JSON 文件,它不会向其传递任何内容。只需访问 URL 并将返回的内容存储在 NSData 对象中。

如果有人知道为什么会这样,我将不胜感激!

谢谢

jason.php: 这会在我的浏览器中完美返回 JSON 脚本

<?php

require("db_connect.php");


//Check to see if we can connect to the server
if(!$connection)

    die("Database server connection failed.");  

else

    //Attempt to select the database
    $dbconnect = mysql_select_db($db, $connection);

    //Check to see if we could select the database
    if(!$dbconnect)
    
        die("Unable to connect to the specified database!");
    
    else
    
        $query = "SELECT * FROM cities";
        $resultset = mysql_query($query, $connection);

        $records = array();

        //Loop through all our records and add them to our array
        while($r = mysql_fetch_assoc($resultset))
        
            $records[] = $r;        
        

        //Output the data as JSON
        echo json_encode($records);
    





?>

db_connect.php 登录详情

  <?php 
    $host = "xxxxx"; //Your database host server
    $db = "xxxxx"; //Your database name
    $user = "xxxxx"; //Your database user
    $pass = "xxxxx"; //Your password
    $connection = mysql_connect($host, $user, $pass);
 ?> 

jason_pasted.php 这与 jason.php 完全相同,但只是粘贴了 db_connect.php 的内容 - 在浏览器中产生完全相同的结果,并且在我的应用程序中使用时也可以使用.

<?php

$host = "xxxxx"; //Your database host server
$db = "xxxxxx"; //Your database name
$user = "xxxxx"; //Your database user
$pass = "xxxxxx"; //Your password

$connection = mysql_connect($host, $user, $pass);


//Check to see if we can connect to the server
if(!$connection)

    die("Database server connection failed.");  

else

    //Attempt to select the database
    $dbconnect = mysql_select_db($db, $connection);

    //Check to see if we could select the database
    if(!$dbconnect)
    
        die("Unable to connect to the specified database!");
    
    else
    
        $query = "SELECT * FROM cities";
        $resultset = mysql_query($query, $connection);

        $records = array();

        //Loop through all our records and add them to our array
        while($r = mysql_fetch_assoc($resultset))
        
            $records[] = $r;        
        

        //Output the data as JSON
        echo json_encode($records);
    





?>

ViewController.m 从应用代码中提取

    -(void) retrieveData

    NSURL *url = [NSURL URLWithString:jsonURL];
    NSData *data = [NSData dataWithContentsOfURL:url];
    json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

    //set up cities array
    citiesArray = [[NSMutableArray alloc]init];

    for (int i=0;i<[json count]; i++)
    
        //create city object
        NSString *cID = [[json objectAtIndex:i] objectForKey:@"id"];
        NSString *cName = [[json objectAtIndex:i] objectForKey:@"cityName"];
        NSString *cState = [[json objectAtIndex:i] objectForKey:@"cityState"];
        NSString *cPopulation = [[json objectAtIndex:i] objectForKey:@"cityPopulation"];
        NSString *cCountry = [[json objectAtIndex:i] objectForKey:@"country"];

        City *myCity = [[City alloc] initWithCityID:cID
                                        andCityName:cName
                                       andCityState:cState
                                  andCityPopulation:cPopulation
                                     andCityCountry:cCountry];

        //add city oject to city array
        [citiesArray addObject:myCity];

    

    [davesTableView reloadData];



TL;DR 该应用程序与 jason_pasted.php 但不能与 jason.php 完美配合。 jason.php 和 jason_pasted.php 在浏览器中打开时返回完全相同的 JSON 脚本。


从 jason.php 和 jason_pasted.php 返回的字符串

(
    
    cityName = London;
    cityPopulation = 8173194;
    cityState = London;
    country = "United Kingdom";
    id = 1;
,
    
    cityName = Bombay;
    cityPopulation = 12478447;
    cityState = Maharashtra;
    country = India;
    id = 2;
,
    
    cityName = "Kuala Lumpur";
    cityPopulation = 1627172;
    cityState = "Federal Territory";
    country = Malaysia;
    id = 3;
,
    
    cityName = "New York";
    cityPopulation = 8336697;
    cityState = "New York";
    country = "United States";
    id = 4;
,
    
    cityName = Berlin;
    cityPopulation = 3538652;
    cityState = Berlin;
    country = Deutschland;
    id = 5;

)

仅当 NSUrl 指向 jason.php 时才返回错误

    2014-02-13 11:43:34.760 JSONios[4655:60b] JSON error: Error Domain=NSCocoaErrorDomain Code=3840
 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or
 object and option to allow fragments not set.) 
UserInfo=0x14659c40 NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.

【问题讨论】:

【参考方案1】:

这被放置在格式化的答案中:

不要忽略错误!

不正确:

json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

注意:文档没有指定可以为 error 参数传递 nil。

正确:

// There is an assumption that the JSON head is a dictionary.
NSError *error;
NSDictionary *jsonAsDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
if (jsonAsDict == nil) 
    NSLog(@"JSON error: %@", error);

else  // For debug only
    NSLog(@"JSON: %@", jsonAsDict);

现在,这段代码会发生什么? 如果可能,请提供 JSON 字符串。 哦,我个人并不关心 php 如何创建 JSON,我只需要查看 JSON。

还是有问题:NSLog 数据为字符串:

NSLog(@"data: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

如果没有数据,则将错误参数添加到 dataWithContentsOfURL:options:error: 代替dataWithContentsOfURL:

【讨论】:

您好 Zaph,非常感谢您的意见。我添加了从 jason.php 和 jason_pasted.php 输出的字符串。它们都是相同的。我的应用程序在 NSUrl 指向 jason_pasted.php 时运行良好,并在从 NSLog(@"JSON: %@", jsonAsDict); 打印输出时返回与浏览器相同的 JSON 脚本我还添加了 NSUrl 指向 jason.php 时返回的错误(唯一的区别是使用'include(db_connect.php)' 传递服务器登录详细信息)

以上是关于ios json在使用include()时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Datatables Ajax 在从文件中读取 JSON 时起作用,但从变量中读取 JSON 时不起作用(Django)

为啥 LLVM 的泄漏消毒剂在与其他启用的消毒剂一起使用时不起作用

ios - 当 presentViewController 关闭时不起作用

@JsonInclude(JsonInclude.Include.NON_EMPTY) 当我使用包装类并返回结果时不起作用

iOS Deeplink 在启动应用程序时不起作用

eslint --fix 在通过 npm 运行时不起作用