使用 json_encode,有没有办法强制某些值不转换为数字?

Posted

技术标签:

【中文标题】使用 json_encode,有没有办法强制某些值不转换为数字?【英文标题】:With json_encode, is there a way to force certain values not to be converted into numeric? 【发布时间】:2016-02-23 20:04:18 【问题描述】:

在使用 php (5.4/5.5) 和 json_encode() 时,我在使用 JSON_NUMERIC_CHECK 选项时遇到了一些问题。这是在生产系统上,所以我不能简单地删除该选项,因为这会改变整个响应并破坏客户端解析。

示例代码:

$var = array("id" => 1195756, "hash" => "7e12");
echo json_encode($var) . "\n";
echo json_encode($var, JSON_NUMERIC_CHECK) . "\n";

输出:

"id":1195756,"hash":"7e12"
"id":1195756,"hash":7000000000000

后者不是我想要的。 “7e12”是我们系统的有效哈希。我意识到它也是松散的科学记数法,但我怎样才能强制将值保留为字符串?

注意:使用strval() 无效。

【问题讨论】:

JSON_BIGINT_AS_STRING 有用吗? JSON_NUMERIC_CHECK 告诉它将数字字符串编码为数字,并且您正在传递一个数字字符串。唯一的选择是不使用JSON_NUMERIC_CHECK 或不传递数字字符串。 “我得到了这个工作的 sn-p 而这个不工作的 sn-p,我怎样才能让后者工作。” - 好吧,使用第一个。 @Onur:不,没有区别。 欧努尔。这可能适用于这个特定的值,尽管我不知道这个值是否被认为足够“大”。但是具有科学记数法的整数(或看起来是具有科学记数法的整数的字符串)也可以计算为小整数值,例如"7e2",在这种情况下它肯定行不通。 【参考方案1】:

不要在应该保留字符串的字段上使用strval(),而是在应该是数字的字段上使用intval()floatval()。换句话说,为 JSON 编码器提供正确的类型。然后,您就不需要JSON_NUMERIC_CHECK 来修复本来应该是数字的东西了。

【讨论】:

这是我最终采取的方向,使用(int) 将数字数据强制到我想要的位置。 PDO/mysql 返回所有字符串,所以不得不做点什么。

以上是关于使用 json_encode,有没有办法强制某些值不转换为数字?的主要内容,如果未能解决你的问题,请参考以下文章

json_encode() 非 utf-8 字符串?

如何强制调用某些构造函数/函数以使用命名参数?

Go 中的命令行标志可以设置为强制吗?

有没有办法强制 apache 返回 404 而不是 403?

有没有办法将多个数组传递给 PHP json_encode 并用 jQuery 解析它?

强制编译器忽略程序中的某些行