1

我有一个 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 中的所有值都保留为整数,但所有键都被制成字符串。有没有一种方法可以只在值上运行我上面的正则表达式?或者任何其他可以给我类似结果的过程?

4

1 回答 1

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}
于 2013-01-06T07:33:31.663 回答