Php json_解码是四舍五入浮动,我如何防止它?
我有一个相当大的json文件,其中包含以下格式的坐标Php json_解码是四舍五入浮动,我如何防止它?,php,json,decode,Php,Json,Decode,我有一个相当大的json文件,其中包含以下格式的坐标 "[[3.2,1],[4.8,2]]" 表示(3.2,1)和(4.8,2) 我使用这些坐标来生成D3地理地图,但当php将这些信息建模到geoJSONobject中时,我遇到以下错误: 我需要将坐标转换成一个数组,使用json\u decode。然而: json_decode("[[3.2,1],[4.8,2]]") 返回 Array ( [0] => Array ( [0] => 3
"[[3.2,1],[4.8,2]]"
表示(3.2,1)和(4.8,2)
我使用这些坐标来生成D3地理地图,但当php将这些信息建模到geoJSONobject中时,我遇到以下错误:
我需要将坐标转换成一个数组,使用json\u decode
。然而:
json_decode("[[3.2,1],[4.8,2]]")
返回
Array
(
[0] => Array
(
[0] => 3
[1] => 1
)
[1] => Array
(
[0] => 4
[1] => 2
)
)
我失去了小数。我怎样才能防止这种情况
编辑:
这是我作为输出得到的数据的一个例子。(它应该表示一个房间的地图,这些房间通过其用途获得密度颜色)
我可以使用jQuery.parseJSON(data)
解析此代码,但运行以下D3代码会产生最奇怪的错误:
val(svgname).append("g")
.selectAll("path")
.data(geoJSONobject.features)
.enter().append("path")
.attr("d", path)
...
我想这是因为坐标数组中的引号
编辑(2)-实际解决方案
我接受的解决方案是一种变通方法,但真正的问题是本地化的php设置。使用:
echo json_encode($dataset, JSON_NUMERIC_CHECK);
在php文件中,所有问题都得到了解决。虽然我会更新这个问题,因为它仍在被研究中(如果有人会遇到这个问题)我也遇到了同样的问题。我用followin正则表达式解决了这个问题 解决方案1
$yourJsonVariable = preg_replace('/:\s*(\-?\d+(\.\d+)?([e|E][\-|\+]\d+)?)/', ': "$1"', $yourJsonVariable);
将其转换为数组
$array = json_decode($yourJsonVariable, true);
积分归此
解决方案2
您可以设置ini\u set('precision',1)代码>
解决方案3
$decoded = json_decode($encoded, true, null, JSON_BIGINT_AS_STRING);
注意:最后一个解决方案仅适用于PHP>5.4
您可能想看看这个只需将值用引号括起来:json_decode(“[[3.2”,“1”,“4.8”,“2]”)代码>您使用的是什么版本的PHP?我运行的是5.5.12,它将它们保留为浮点数。我不知道是什么原因导致了这种情况,但可能是一种解决方法:将它们作为字符串传递,然后在收到坐标时将它们转换为浮点数。文档()确实提到将大整数转换为浮点数,但您的看起来不是很大;)@欧文莫勒关于使用字符串的建议绝对有效。你是否对为什么会发生这种情况感到好奇是另一回事。对于5.2.0-7.0.0alpha2
var_dump()
持有JSON的var来说很好。只需将值括在引号中:JSON_decode('[[3.2”,“1”,“4.8”,“2]”)代码>这是一种变通方法,而不是解决方案。它依赖于PHP和/或ECMAScript中的动态键入,其中根据上下文解释“3.1”
和3.1
。从形式上讲,JSON中的“3.1”
是一个字符串,而3.1
是一个浮点类型,任何与之同名的JSON解码器都应该能够对其进行解码。我想解决方案应该是使用最新版本的php。因为Tom Jenkins和其他人确认它在他们的机器上工作。很遗憾,我无法执行升级。同时,这解决了我的问题,这就是为什么我把它标记为解决方案。应该标记为正确答案!建议的解决方案1对我来说就像一个charmAfter一些测试之后,regex在引号中匹配数字/:\s*(?!\B“[^”]*)(\-?\d+(\.\d+)([e | e][\-\+]\d+)(![^”]*\B)/
此条件将只引用尚未引用的数字
$decoded = json_decode($encoded, true, null, JSON_BIGINT_AS_STRING);