如何确保PHP生成的JSON中的所有键名都是字符串?

时间:2013-01-06 07:25:12

标签: php json

我有一个PHP脚本输出JSON数据,这些数据由浏览器中的Javascript以及iPhone和Android应用程序解析。

以前,我发现当PHP将数组数据转换为JSON时,它会将所有数字值转换为字符串,如双引号所示。因此,例如,"id" : 1将成为"id" : "1"。这似乎混淆了一些接收JSON数据的Javascript函数,所以我在PHP中的JSON上运行这个正则表达式,以确保数字不是字符串:

$JSONOutput = preg_replace('/"(-?\d+\.?\d*)"/', '$1', json_encode($JSONOutput));

但是,这也可以从键和值中删除双引号,因此1 : "first value"变为"1" : "first value"。事实证明这是一个问题,因为如果JSON键不是字符串,那么接收数据的iPhone应用就会抱怨。

所以,我想要做的是确保JSON中的所有值都保存为整数,但所有键都被创建为字符串。有没有办法可以在值上运行我上面的正则表达式?或者任何其他会给我类似结果的过程?

1 个答案:

答案 0 :(得分:2)

  

有没有办法可以在值上运行我上面的正则表达式?

你最好避免对字符串进行后期处理。

  

以前,我发现当PHP将数组数据转换为JSON时,它会将所有数字值转换为字符串,如双引号所示。因此,例如,“id”:1将变为“id”:“1”。

这里的答案是确保数字值确实是数字。如果您在数字中看到带有数字的字符串,那是因为PHP对象/数组中的值不是数字。这就是你需要解决的问题。

例如,此代码:

<?php
    header('Content-Type: application/json');
    $x = array(
        "number" => 1,
        "string" => "2"
        );
    echo json_encode($x);
?>

...非常正确地产生了这个输出:

{"number":1,"string":"2"}

注意PHP代码中真正数字的值是如何作为JSON中的数字出现的。

因此,不是对字符串进行后期处理,而是将所提供的数据更正为json_encode


回复以下评论:

  

据我所知,我可以专门为键分配字符串名称,但是有问题的数组是使用while循环自动生成的,该循环会保留附加数字,这些数字用于计数操作,因此我认为这不会起作用就我而言。

它没有丝毫差别。例如,此代码:

<?php
    header('Content-Type: application/json');
    $x = array();
    for ($n = 1; $n < 5; ++$n) {
       $x["entry" . $n] = $n;
    }
    echo json_encode($x);
?>

生成此输出:

{"entry1":1,"entry2":2,"entry3":3,"entry4":4}

再次注意输入中的数字是数字,因此输出中的数字。

另请注意,如果对象的是数字,PHP会正确处理它:

<?php
    header('Content-Type: application/json');
    $x = array();
    $x["foo"] = "bar";
    for ($n = 1; $n < 5; ++$n) {
       $x[$n] = $n * 2;
    }
    echo json_encode($x);
?>

产生

{"foo":"bar","1":2,"2":4,"3":6,"4":8}