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) 当我使用包装类并返回结果时不起作用