返回只有一个JSON对象而不是多个对象PHP?
返回只有一个JSON对象而不是多个对象PHP?
请先查看这个JSON:http://ws.luyencong.net/data/search/query.php?do=json
以下是它的代码:
/* --- 执行查询并获取数据。--- */ $query = $db->query("SELECT t.* FROM ".TABLE_PREFIX."threads t"); while($data = $db->fetch_array($query)) { $results[] = array($data['subject'] => $data['subject']); $json = json_encode($results, JSON_FORCE_OBJECT); } /* --- 将结果打印到屏幕上,以备将来使用。--- */ echo $json;
但我希望输出的JSON格式看起来像这样:http://ws.luyencong.net/data/search/json.txt
将不胜感激您的帮助。感谢您的一切。
祝您拥有愉快的一天!
问题:返回的只是一个JSON对象而不是多个对象的原因是什么?有什么解决方法?
问题的原因是代码中嵌套了数组。看起来你只想要一个单独的JSON对象,而不是一个对象数组。所以,将$result
的设置更改为:
$results[$data['subject']] = $data['subject'];
然后按照建议,将json_encode
移到循环之外,直到数组被填充之后再进行编码。你只是一次又一次地无故覆盖变量。
以下是一种可能的解决方法:
$results = array(); while ($row = mysqli_fetch_array($result)) { $data = array( 'subject' => $row['subject'], 'author' => $row['author'], 'date' => $row['date'] ); $results[] = $data; } echo json_encode($results);
这样做将返回一个包含多个对象的JSON数组。如果你只想返回一个JSON对象,而不是数组,可以像下面这样修改代码:
$result = array(); while ($row = mysqli_fetch_array($result)) { $data = array( 'subject' => $row['subject'], 'author' => $row['author'], 'date' => $row['date'] ); $result = $data; } echo json_encode($result);
这样修改后,$result
将只包含一个对象,而不是一个对象数组。
问题的原因是在循环中,每次都将数据存储到一个数组中,然后使用json_encode函数将整个数组转换为JSON格式。这导致返回的JSON字符串中包含了多个对象。
解决方法是在循环中直接将数据存储到一个关联数组中,其中键是数据的一个属性,值是该属性的值。然后在循环结束后,使用json_encode函数将关联数组转换为JSON格式。
以下是修改后的代码:
/* --- 执行查询并获取数据。--- */ $query = $db->query("SELECT t.* FROM ".TABLE_PREFIX."threads t"); $results = array(); while($data = $db->fetch_array($query)) { $results[$data['subject']] = $data['subject']; } /* --- 将结果输出到屏幕上,以备将来使用。--- */ echo json_encode($results, JSON_FORCE_OBJECT);
在修改后的代码中,我们将$results数组变为一个关联数组,并使用$data['subject']作为键和值。然后在循环结束后,我们使用json_encode函数将$results数组转换为JSON格式,并使用JSON_FORCE_OBJECT选项确保返回的是一个对象,而不是一个数组。这样,我们就可以得到只包含一个对象的JSON字符串。
问题的原因是在循环内部调用了json_encode函数,导致每次循环都会生成一个新的JSON对象,最终只返回了最后一个对象。解决方法是将json_encode函数移动到循环外部,在循环结束后统一调用。
下面是修改后的代码:
/* --- 执行查询并获取数据 --- */ $query = $db->query("SELECT t.* FROM ".TABLE_PREFIX."threads t"); while($data = $db->fetch_array($query)) { $results[$data['subject']] = $data['subject']; } $json = json_encode($results, JSON_FORCE_OBJECT); /* --- 将结果输出到屏幕,以备将来使用 --- */ echo $json;
原帖中的代码中,每次循环都会生成一个新的JSON对象,因此最终只返回了最后一个对象。将json_encode函数移动到循环外部后,只在循环结束后调用一次json_encode函数,将所有结果转化为一个JSON对象并返回。
这样修改后的代码不仅效率更高,而且将返回一个包含所有结果的JSON对象,满足了原帖中的要求。