【发布时间】:2013-01-06 07:25:12
【问题描述】:
我有一个 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 中的所有值都保留为整数,但所有键都制成字符串。有没有一种方法可以只在值上运行我上面的正则表达式?或者任何其他可以给我类似结果的过程?
【问题讨论】:
-
我不明白。 JSON 对象的键是 always 字符串。你的问题令人困惑。您能否展示一个数组的具体示例以及它是如何编码的以及您想对其进行哪些更改?
-
不要转换
json_encode的输出,修改你发送给它的输入。使用array_walk_recursive遍历所有值并使用is_numeric($value) ? floatval($value) : $value或类似的东西进行转换。 -
@DCoder:听起来不错。你能在答案中提供一个详细的例子吗?
-
我认为 TJCrowder 的回答很好地解释了这个问题。 (另外,我的建议是相当严厉的。将数据转换为正确的数据类型不应该只是“如果它像数字一样走路并且像数字一样嘎嘎叫,将其转换为数字”,它应该使用领域知识来完成字段是数字,哪些不是。)
-
@DCoder 等人,通过探索这个问题,我意识到我的根本问题是我从 MySQL 获取值的方式。我已经打开 another question 来解决这个问题。