PHP/IOS:为 Web 服务编码 json 的最佳方式是啥?
Posted
技术标签:
【中文标题】PHP/IOS:为 Web 服务编码 json 的最佳方式是啥?【英文标题】:PHP/IOS: what is best way to encode json for web service?PHP/IOS:为 Web 服务编码 json 的最佳方式是什么? 【发布时间】:2015-09-22 22:21:56 【问题描述】:我正在尝试创建一个 Web 服务,通过 php 从 mysql 数据库提供 json 以在 iPhone 应用程序中显示。
我有一个标准的 mysql/php 设置。
数据位于包含字段和记录的表中。用sql查询创建记录集。记录集中的每条记录都是一行。
php
$sql = "SELECT userid,task,longtask FROM tasks WHERE userid = 1 LIMIT 1";
$res = mysql_query($sql) or die(mysql_error());
$tasks = array();
while($row = mysql_fetch_assoc($res))
$tasks[] = array('row'=>$row);
echo json_encode(array('tasks'=>$tasks));
//
Web 服务产生以下输出:
"tasks":["row":"userid":"1","task":"send email to Bob","longtask":"include attached memo"]
但是,我在将其读入 ios 时遇到了很多麻烦,这表明 Web 服务可能有更好的格式。
结构不同于我在教程和其他资源中找到的用于将 json 读入 IOS(均不使用 php/mysql)的结构。
谁能告诉我一个更好的方式来构造 json 或者代码来在 iOS 中读取这个 json 来获取用户 ID、任务和其他变量。
当我尝试这个时,我得到一个错误,它不能在 index:0 处显示行
NSError* error;
NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData //1
options:kNilOptions
error:&error];
NSLog(@"about to print json: %@",json);
NSMutableArray *getElement = [json objectForKey:@"tasks"];
for (NSDictionary *dict in getElement)
NSArray *array = [dict objectForKey:@"row"];
NSString *str = [array objectAtIndex:0];
提前感谢您的任何建议。
【问题讨论】:
你试过laravel.com框架吗? 在我真正理解发生了什么之前尽量避免使用框架。我正在寻找 json 格式,即什么是字典,什么是数组,以及您是否可以在服务器输出中控制这一点令人困惑。 【参考方案1】:方法一:编辑 PHP 代码
索引 0 不可用,因为您使用 mysql_fetch_assoc
从 PHP 获取关联数组。
默认情况下,使用mysql_fetch_array
将返回一个包含从零开始的索引和关联键的数组。
$sql = "SELECT userid,task,longtask FROM tasks WHERE userid = 1 LIMIT 1";
$res = mysql_query($sql) or die(mysql_error());
$tasks = array();
while($row = mysql_fetch_array($res))
$tasks[] = array('row'=>$row);
echo json_encode(array('tasks'=>$tasks));
会输出
"tasks":["row":"0":"1","userid":"1","1":"send email to Bob","task":"send email to Bob","2":"include attached memo","longtask":"include attached memo"]
现在您可以使用 0
或 userid
中的任一键检索用户 ID。
方法二:编辑iOS代码
编辑 iOS 代码。但要使其正常工作,您必须知道行中的键。
NSString *str = [array objectForKey:@"userid"];`
【讨论】:
第一种更改为 mysql_fetch_array 的方法似乎应该可以工作,但仍然会产生相同的错误。你会在哪里编辑 iOS 代码?它代替 NSString 生成 Expected 表达式,并且没有可见的 NSArray 的@interface 声明选择器 objectforkey 错误。 我猜因为这两种类型的数组已经组合在一起,所以 0 也被认为是键而不是索引。这使得数组成为一个对象。试试mysql_fetch_array($res, MYSQL_NUM);
,这只会返回一个基于索引的数组。如果这样做了,我认为您可能不需要 iOS 编辑。以上是关于PHP/IOS:为 Web 服务编码 json 的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章