通过POST将JSON编码的变量从PHP传递到Javascript

问题描述:

我有一个多维数组,我想将其发送到带有Javascript的PHP脚本,该Javascript解析JSON数据并将其绘制在Google Maps上.我正在尝试使用表单对其进行仿真:

I have an multi-dimensional array that I want to send to a PHP script with a Javascript that parses the JSON data and plot it on Google Maps. I'm trying to simulate it using forms:

<?php
$jsontest = array(
    0 => array(
        'plate_no' => 'abc111',
        'longlat' => array(121.003895,14.631563),
        'info' => 'first item'
        ),
    1 => array(
        'plate_no' => 'abc222',
        'longlat' => array(121.103895,14.731563),
        'info' => 'second item'
        )
    );
$jsonarray = json_encode($jsontest);
?>
<form action="json-target.php" method="post" accept-charset="utf-8">
        <input type="hidden" name="jsonarray" value="<?php echo $jsonarray; ?>" id="jsonarray">
    <p><input type="submit" value="Continue &rarr;"></p>
</form>

json-target.php看起来像这样:

json-target.php looks like this:

<?php
    print "The value of \$_POST is ";
    print_r($_POST);
?>

$_POST的输出为Array ( [jsonarray] => [{ ).我想将$jsonarray变量的内容传递给Javascript函数(请参见下面的更新).

And the output of $_POST is Array ( [jsonarray] => [{ ). I wanted to pass the contents of the $jsonarray variable to a Javascript function (please see update below).

更新:我还有一个简单的Javascript,它应该解析从$_POST接收的值并通过alert()发布该值:

UPDATE: I also have a simple Javascript that's supposed to parse the value received from $_POST and post the value via alert():

<script src="/js/json2.js" type="text/javascript" charset="utf-8"></script> 
<script type="text/javascript" charset="utf-8">
    var json = JSON.parse(<?php echo $_POST['jsonarray'] ?>);
    for (var i = 0; i < json.length; i++) { 
        alert(json[i]); 
     }
</script>

但是输出中包含反斜杠字符.

But the output is mangled with backslash characters.

var json = JSON.parse([{\"plate_no\":\"abc111\",\"longlat\":[121.003895,14.631563],\"info\":\"first item\"},{\"plate_no\":\"abc222\",\"longlat\":[121.103895,14.731563],\"info\":\"second item\"}]);

有什么更好的方法?

JSON编码广泛使用了引号.通过简单地将JSON编码的字符串输出到HTML value属性中,引号将干扰标记.它们需要转义以放入HTML中.试试这个:

JSON encoding makes extensive use of quotes. By simply outputting a JSON encoded string into your HTML value attribute, the quotes will interfere with the markup. They need to be escaped to be put into the HTML. Try this:

<input type="hidden" name="jsonarray" value="<?php echo htmlspecialchars($jsonarray,ENT_QUOTES); ?>" id="jsonarray">

响应您的更新,我不确定您的JSON.parse应该做什么.从技术上讲,用json_encode()编码的任何内容在技术上都是有效的Javascript对象,不需要进一步解析.如果我有一个名为$obj且名称属性为'hello'的对象,则可以执行以下操作:

In response to your update, I'm not sure what your JSON.parse is supposed to be doing. Anything encoded with json_encode() in PHP is technically a valid Javascript object, and doesn't need to be parsed any further. If I had an object named $obj with a name property of 'hello', I could do this:

<script type="text/javascript">
var o = <?php echo json_encode($obj); ?>;
alert(o.name);
</script>

,并收到警告说你好". json_encode的输出是一个非常合适的javascript对象.

and get an alert saying 'hello'. The output of json_encode is a perfectly suitable javascript object.

$_POST数组的输出已用斜杠转义的事实使我认为,也许您的

The fact that the output of your $_POST array has been escaped with slashes leads me to think that perhaps your magic_quotes_gpc directive is set to be on. If that's the case, you'll have to unescape your $_POST variables with stripslashes().