2011-06-06 27 views
2

當名稱缺少雙引號時可以解析JSON嗎?該JSON是從谷歌來了,它在形式:解析JSON缺少名稱上的引號

{e:"Data",b:"Data",f:"Data"} 

我不能告訴他們的谷歌JSON是無效的,因爲它可能是一個原因,他們的專有系統無效。當使用json_decode()時,它返回NULL。

他們的任何庫能夠以這種格式解析JSON嗎?

回答

0

確實,這看起來無效。您可能想要考慮使用一段自定義的PHP代碼來添加引號。

+1

我同意。一個簡單的preg_replace應該就足夠了。 – 2011-06-06 10:47:50

5

JSON是YAML的一個子集,所以任何有效的JSON語法都是有效的YAML語法。然而,YAML並不需要引用屬性名稱,所以YAML解析器將會處理這個內容。

我首選的YAML解析器是Symfony YAML component,你如下可以使用:

<?php 

include('yaml/lib/sfYaml.php'); 

var_dump(sfYaml::load('{e:"Data",b:"Data",f:"Data"}')); 

輸出:

array(3) { 
    ["e"]=> 
    string(4) "Data" 
    ["b"]=> 
    string(4) "Data" 
    ["f"]=> 
    string(4) "Data" 
} 
4

//序列化本地JavaScript對象JSON。引用關鍵名稱。密鑰=> '鍵'

function fix_json($j){ 
    $j = trim($j); 
    $j = ltrim($j, '('); 
    $j = rtrim($j, ')'); 
    $a = preg_split('#(?<!\\\\)\"#', $j); 
    for($i=0; $i < count($a); $i+=2){ 
    $s = $a[$i]; 
    $s = preg_replace('#([^\s\[\]\{\}\:\,]+):#', '"\1":', $s); 
    $a[$i] = $s; 
    } 
    //var_dump($a); 
    $j = implode('"', $a); 
    //var_dump($j); 
    return $j; 
} 

實施例:

$json = '{e:"Data",b:"Data",f:"Data"}'; 
echo fix_json($json); 

輸出:

{"e":"Data","b":"Data","f":"Data"}