将JSON从PHP返回到JavaScript?


135

我有一个通过jQuery AJAX调用的PHP脚本。我希望PHP脚本将JSON格式的数据返回给javascript。这是PHP脚本中的伪代码:

$json = "{";
foreach($result as $addr)
{
    foreach($addr as $line)
    {
        $json .= $line . "\n";
    }
    $json .= "\n\n";
}
$json .= "}";

基本上,我需要将两个for循环的结果插入$ json中。

Answers:


194

Php具有内置的JSON序列化功能。

json_encode

json_encode

如果可以并且不会遭受“此处未发明”综合症,使用它。


2
非常好,谢谢。在发布SO之前,我实际上已经查询过此内容,但我认为我的托管服务器上不提供此功能。
AquinasTub

这个“答案”不完整,没有用。有关更多完整信息,请参见aesede的答案。
Funk Doc

@FunkDoc所讨论的OP是手工将JSON串在一起的,这是他们唯一的选择。知道这不是他们唯一的选择是一个合适的解决方案。有没有义务在于该JSON的最终结果将被发射为HTTP响应。如果您使用JSON所做的不仅仅是简单地“将其原样返回到网页”,那么“添加标头”信息虽然在一种情况下很有用,但对您没有帮助。这个问题并没有给用例增加澄清。
肯特·弗雷德里克

(此外,对于AJAX来说,设置标头并不是严格必需的。如果我看起来很抱歉,我很抱歉,但是引号中的“'answer”一词给我的阴影确实使我感到震惊,那是10年前的事情了,让它早已死掉。我很早以前就从PHP迁移到现在,我迁移到的语言从这里移开了。)
Kent Fredric

145

以下是先前答案中缺少的几件事:

  1. 在您的PHP中设置标头:

    header('Content-type: application/json');
    echo json_encode($array);
  2. json_encode()可以返回JavaScript 数组而不是JavaScript 对象,请参见:
    从PHP脚本返回JSON
    这在某些情况下很重要,因为数组和对象并不相同。


2
重要的是要注意,数据是回显而不是返回 ed!第一次学习这个概念时,这让我感到很痛苦。因为在一般编程中,几乎所有内容通常都返回而不是“打印”。
Juha Untinen

嘿@Juha,请记住,json_encode()(像所有函数一样)总是返回某些内容(包括NULL);您可以打印数据,处理它,然后打印出来,它assing以供以后使用一个变量,将其保存到一个文件,等等......你可以阅读更多有关returnPHP中:返回值。您也可以(并且应该!)检查每个未知函数返回的内容,请参见示例json_encode(),该函数声明成功时返回JSON编码的字符串,失败时返回FALSE。
aesede 2015年

那时,我想知道为什么return json_encode($jsonArray);不起作用(AngularJS http.get什么也没得到),直到后来我注意到它:)
Juha Untinen 2015年

83

PHP文档中有JSON部分。不过,您将需要PHP 5.2.0。

从PHP 5.2.0开始,JSON扩展默认捆绑并编译为PHP。

如果没有,您可以安装以下PECL库

<?php
    $arr = array ('a'=>1,'b'=>2,'c'=>3,'d'=>4,'e'=>5);

    echo json_encode($arr); // {"a":1,"b":2,"c":3,"d":4,"e":5}
?>

13

通常,您会对在接收端对数据也具有某种结构感兴趣:

json_encode($result)

这也将保留阵列键。

请记住,json_encode仅适用于utf8编码的数据。


4

您可以对PHP使用Simple JSON。它发送标题以帮助您伪造JSON。

看起来像 :

<?php
// Include the json class
include('includes/json.php');

// Then create the PHP-Json Object to suits your needs

// Set a variable ; var name = {}
$Json = new json('var', 'name'); 
// Fire a callback ; callback({});
$Json = new json('callback', 'name'); 
// Just send a raw JSON ; {}
$Json = new json();

// Build data
$object = new stdClass();
$object->test = 'OK';
$arraytest = array('1','2','3');
$jsonOnly = '{"Hello" : "darling"}';

// Add some content
$Json->add('width', '565px');
$Json->add('You are logged IN');
$Json->add('An_Object', $object);
$Json->add("An_Array",$arraytest);
$Json->add("A_Json",$jsonOnly);

// Finally, send the JSON.

$Json->send();
?>

警告:适用于PHP的简单JSON已获得GPLv2许可,因此您必须自己开放代码才能使用它。
Jamie Birch '18

1
现在获得MIT许可:)
亚历克西斯·帕克斯

1
@JamieBirch实际上,我认为您误会了GPL的工作原理。如果您在谈论AGPL,那么您将有所收获。但是,大量的Internet都是基于GPL软件构建的,因此没有义务公开其代码,因为它们不会给用户任何可控的可执行文件,而只是提供接口。他们唯一的义务是,也必须向他们提供项目数字副本的任何人提供源。
肯特·弗雷德里克

1

$ msg =“您输入了错误的用户名或密码”; $ responso = json_encode($ msg);

echo "{\"status\" : \"400\", \"responce\" : \"603\", \"message\" : \"You Enter Wrong Username OR Password\", \"feed\":".str_replace("<p>","",$responso). "}";
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.