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 服务,通过 phpmysql 数据库提供 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"]

现在您可以使用 0userid 中的任一键检索用户 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 的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

从 PHP Web 服务未正确返回编码响应

如何使用 python 将私钥编码为 RS256 格式的 JSON WEB TOKEN

JSON编码格式提交表单数据详解

json是啥编码

JSON Web 服务是不是容易受到 CSRF 攻击?

如何访问 json 网络服务?