将类似JSON的字符串转换为PHP数组

时间:2018-04-05 08:13:51

标签: php json

我有一些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 );,它会将数据打印为字符串。我在这做错了什么?我已经看过很多关于此的其他问题,但没有一个能解决这个问题。它似乎没有同样的方式。

2 个答案:

答案 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);