给定一个浮点数,在json编码和后续解码之后,变量类型float(或double)有时它不会被保留.
$n1 = 1.23;
$json = json_encode($n1); // '1.23'
$n2 = json_decode($json);
$t1 = gettype($n1); // 'double'
$t2 = gettype($n2); // 'double'
$d = $n1 === $n2; // true
Run Code Online (Sandbox Code Playgroud)
但是,当小数为"0"时,结果会有所不同:
$n1 = 1.0;
$json = json_encode($n1); // '1'
$n2 = json_decode($json);
$t1 = gettype($n1); // 'double'
$t2 = gettype($n2); // 'integer'
$d = $n1 === $n2; // false
Run Code Online (Sandbox Code Playgroud)
我必须得出结论,json编码/解码函数的行为是基于数据值的,因此难以预测,并且最终非常不一致.
有没有办法确保在json编码/解码过程中保留变量的类型?
JSON格式本身没有浮点数和整数的概念,只有数字.这是它与语言无关的数据格式的原因之一.
但是,我发现json_encode选项JSON_PRESERVE_ZERO_FRACTION可以解决问题.
JSON_PRESERVE_ZERO_FRACTION
确保浮点值始终编码为浮点值.从PHP 5.6.6开始提供.
它强制json_encode始终将至少一个'0'十进制数字放到JSON表示法中.
就其本身而言,json_decode本身能够将具有十进制数字的数字解释为float,并且它不需要任何特殊标志.
$n1 = 1.0;
$json = json_encode($n1, JSON_PRESERVE_ZERO_FRACTION); // '1.0'
$n2 = json_decode($json);
$t1 = gettype($n1); // 'double'
$t2 = gettype($n2); // 'double'
$d = $n1 === $n2; // true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1147 次 |
| 最近记录: |