【问题标题】:With json_encode, is there a way to force certain values not to be converted into numeric?使用 json_encode,有没有办法强制某些值不转换为数字?
【发布时间】: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",在这种情况下它肯定行不通。

标签: php json scientific-notation


【解决方案1】:

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

【讨论】:

  • 这是我最终采取的方向,使用(int) 将数字数据强制到我想要的位置。 PDO/mysql 返回所有字符串,所以不得不做点什么。
猜你喜欢
  • 1970-01-01
  • 2010-10-09
  • 2015-09-07
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2020-05-20
  • 1970-01-01
相关资源
最近更新 更多