给定一个浮点数,在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
然而,当小数位数是' 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
我必须得出结论,json编码/解码函数的行为是基于数据值的,因此难以预测,最终非常不一致。
有没有办法确保在json编码/解码过程中保留变量的类型?
答案 0 :(得分:7)
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