标准序列化还是定制?

时间:2010-12-23 16:23:59

标签: php serialization

任何人都可以识别这种格式(如果它是标准格式),还是应该手动爆炸才能获得数组?感谢。

{ coords : {lon : 7.41891, lat : 43.73253}, address : "", zipCode : "98000", city : "Monaco", sK : "Monaco", sQ : "852", fV : "", fZ : "98000 Monaco", fW : "- MC - Monaco: Monaco (98000)", gf : "31NDFzeHoxMGNORE11TnpNeU5UTT1jTnk0ME1UZzVNUT09", reflexId : "84167", areaLabel : "Monaco", jalon : 4}

YAML to VarExport给出了这个但后来失败了。

array (
  'coords' => 
  array (
    'lon' => 20.48406,
    'lat' => 44.80572,
  ),
)

解决方案:

$data = preg_replace('#([\w]+) :#is', '"$1" :', $data);

结果:

array (
  'coords' => 
  {
     'lon' => 7.41891,
     'lat' => 43.73253,
  },
  'address' => '',
  'zipCode' => '98000',
  'city' => 'Monaco',
  'sK' => 'Monaco',
  'sQ' => '852',
  'fV' => '',
  'fZ' => '98000 Monaco',
  'fW' => '- MC - Monaco: Monaco (98000)',
  'gf' => '31NDFzeHoxMGNORE11TnpNeU5UTT1jTnk0ME1UZzVNUT09',
  'reflexId' => '84167',
  'areaLabel' => 'Monaco',
  'jalon' => 4,
)

4 个答案:

答案 0 :(得分:2)

它是有效的JavaScript代码,几乎 JSON。要使它成为有效的JSON,它需要将对象属性名称括在双引号中,并用逗号分隔数组项。

此:

$text = preg_replace('/(\r?\n){2}/', ',', trim($text));
$text = preg_replace('/([{,])\s?([a-z0-9_]+)\s?:/i', '$1"$2":',$text);
print_r(json_decode($text));

将适用于您的示例。

但是你不应该使用它,因为当内部有,{值时它会失败!

最安全的方法是自己构建一个解析器。

答案 1 :(得分:0)

看起来像json序列化给我,所以相当标准。 :)

答案 2 :(得分:0)

Bad JSON。我会将哈希键转换为字符串然后json_decode。你可以很简单地使用PHP Tokenizer来做到这一点。

function parse($code) {
    $result = '';
    $tokens = tokens_get_all('<?php ' . $code);
    array_shift($tokens); // drop <?php
    foreach ($tokens as $token) {
        if (!is_array($token)) {
            $result .= $token;
            continue;
        }

        if ($token[0] == T_STRING) {
            $token[1] = '\'' . addslashes($token[1]) . '\'';
        }

        $result .= $token[1];
    }

    return json_decode($result);
}

答案 3 :(得分:0)

经过一些研究,它看起来肯定是格式不正确的JSON。但是,它并不太遥远。事实上,使用两个正则表达式,您可以轻松地将字符串转换为正确的JSON。

Find:
    /(\w+)\s+\:/
Replace:
    "$1" :

Find:
    /(})(\s+{)/
Replace:
    $1,$2

你可以在PHP中这样做:

$good_json = preg_replace(array('/(\w+)\s+\:/i','/(})(\s+{)/'), array('"\1" :', '\1,\2'), $bad_json);
var_dump( json_decode($good_json) );
相关问题