将PHP JSON传递给Javascript:echo-JSON_encode vs echo-JSON声明


Passing PHP JSON to Javascript: echo json_encode vs echo json declaration

我正在尝试创建一个公共常量文件,以便在php和javascript之间共享,使用JSON来存储常量。但我想知道为什么要使用json_encode()将JSON从PHP传递到javascript,而不是回显JSON声明。

假设我有PHP JSON

<?php 
$json_obj = '{"const1": "val",
            "const2": "val2"             
                            }';
?>

在谷歌上搜索,似乎返回javascript的典型方式是使用

<?php echo json_encode($json_obj); ?>

然后我相信我必须使用类似$.getScript()的东西来读取php文件以获得$json_obj,然后使用parseJSON()使其在javascript中可用。

但为什么不改为

<?php  echo 'var json = '.$json_obj; ?>

通过这种方式,您所要做的就是直接加载脚本,并准备好直接使用json。

为什么使用json_encode()比简单地将声明回显到javascript更有利?

在您的例子中,$json_obj已经是一个字符串。所以没有必要。但是,如果您有一个要传递给javascript的数组,json_encode将对此有所帮助。

这一切都取决于您想从服务器向客户端发送什么——无论是数据(JSON)还是一些代码。

两种方法:

  1. 在服务器上回显一个JSON文件,然后打印JSON文档并将响应Content-Type设置为application/json。通过这种方式,您可以使用任何您想要的AJAX库,如$.get或原始XMLHttpRequest等。这是一种传递数据的方式。

  2. 在服务器上回显Javascript代码,然后使用$.getScript加载它。这是一种传递代码的方式。这可能不太安全,因为您的代码不仅可以包含JSON,还可以包含任何任意代码。所以,如果攻击者能够破坏您的服务器,他就可以将代码推送到任何客户端进行远程执行。

如果您只想传递数据,请使用第一种方法。它更干净、更安全。

此外,如果您最终在不同的环境中编写前端,比如说不同的编程语言,那么您将能够恢复相同的JSON返回端点。如果您返回Javascript代码,这将更加困难。

将PHP JSON传递给Javascript并读取

var data = <?php echo json_encode($json); ?>;
var arr = new Array();
arr = JSON.parse(data);
document.write( arr[0].something );

尽管这对您的特定问题来说可能有些过头了,但我仍然会选择json_encode/parse选项。为什么?你问。好吧,把它看作是避免重复。如果你编码/解析,你可以把常量保存在一个对象中,让PHP代码很容易阅读。JS代码也是如此。

它只是消除了对它的干扰。

constant.php

<?php
$array = array("const1" => "val", "const2" => "val2");
?>
<script>
var contants = <?php echo json_encode($array); ?>
</script>

=====================文件结束常量.php======

在php中,您可以使用访问

$array["<key>"]

在javascript中,您可以使用访问

contants.const1, ....

通常这就是我所做的,也是我发现的最安全的方法:

// holds variables from PHP
var stuff = {};
try {
    // stuff will always be an object
    stuff = JSON.parse('<?php echo empty($stuff) ? '{}' : json_encode($stuff) ?>');
} catch (e) {
    if (e instanceof SyntaxError)
    {
        // report syntax error
        console.error("Cannot parse JSON", e);
    }
}
// show resulting object in console
console.log("stuff:", stuff);

如果使用php数组而不是字符串,则使用json_encode

$array = array("const1" => "val", "const2" => "val2");
echo json_encode($array);

如果你在一个字符串上调用json_encode,你会得到:

"{'"const1'": '"val'", '"const2'": '"val2'"}"

json_encode()的参数应该是PHP数据结构,而不是已经是JSON格式的字符串。当您想将PHP对象传递给Javascript时,可以使用此选项。

json_encode是一个将PHP数组转换为JSON字符串的函数,仅此而已。由于$json_obj变量已经为JSON字符串,因此不需要进一步的转换,您只需将其回显即可。

要从数组中获取$json_obj字符串,您的代码看起来像这个

$json_array = array(
    "const1" => "val",
    "const2" => "val2"
);
$json_obj = json_encode($json_array);

PHP到JSON

var locations = <?php echo json_encode($sample_location_master); ?>;