我有一些JSON数据作为字符串保存在文本区域中。虽然它看起来像JSON,但从技术上来说;不是JSON。
如何在PHP中将此字符串转换为数组?以下是将在Google地图上使用的纬度和经度坐标的示例:
字符串:
[{lng: -0.000000, lat: 10.000000},{lng: -0.000000, lat: 10.000000},{lng: -0.000000, lat: 10.000000},{lng: -0.000000, lat: 10.000000}]
PHP:
// get the coordinates
$coords = coordinates( 123 );
// Encode it into actual JSON
$coords = json_encode( $coords );
// Decode it into an array
$coords = json_decode( $coords, true );
如果我然后使用var_dump( $coords );
,它会将数据打印为字符串。我在这做错了什么?我已经看过很多关于此的其他问题,但没有一个能解决这个问题。它似乎没有同样的方式。
答案 0 :(得分:3)
如果您无法修复生成此数据的内容,您可以尝试使其有效,只要它至少与有效性不太相关。在您的示例中,仅缺少键的双引号,您可以尝试使用:
$str = '[{lng: -0.000000, lat: 10.000000},{lng: -0.000000, lat: 10.000000},{lng: -0.000000, lat: 10.000000},{lng: -0.000000, lat: 10.000000}]';
$str = preg_replace('/({\s*|,\s*)([0-9a-zA-Z]+)(\s*:)/', '$1"$2"$3', $str);
var_dump($str); //string(149) "[{"lng": -0.000000, "lat": 10.000000},{"lng": -0.000000, "lat": 10.000000},{"lng": -0.000000, "lat": 10.000000},{"lng": -0.000000, "lat": 10.000000}]"
$data = json_decode($str);
if($data !== null){
//$data decoded properly
}
这很快就完成了,你可能需要根据你的需要调整键中的字符标准。
编辑:还删除了[0-9a-zA-Z]+
中的懒惰量词,这是从以前使用的不必要的更宽范围中留下的
答案 1 :(得分:1)
正如您清楚地指出了语法的样子,并假设总会有两级嵌套和类似的结构,手动编写解析器并不太难。
如果结构确实比我假设的更复杂,请指明伪JSON的复杂程度。
手写的解析器可以,例如。 g。,看起来像那样:
<pre><?php
$data = "[{lng: -0.000000, lat: 10.000000},{lng: -0.000000, lat: 10.000000},{lng: -0.000000, lat: 10.000000},{lng: -0.000000, lat: 10.000000}]";
$arr = array();
foreach(preg_split("/},{/", substr($data, 2, -2)) as $entry) {
$subarr = array();
foreach(preg_split("/, /", $entry) as $subentry) {
list($key, $val) = preg_split("/: /", $subentry);
$subarr[$key] = $val;
}
$arr[] = $subarr;
}
print_r($arr);