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