2009-08-28 37 views
0

我有一個字符串,它看起來像這樣:這是什麼類型的符號?

[{text:"key 1",value:"value 1"},{text:"key 2",value:"value 2"},{text:"key 3",value:"value 3"}] 

我不知道這是什麼樣的符號,這是由ASP .NET後臺生成AFAIK。它看起來和JSON非常相似,但是調用json_decode()會失敗。

有人可以給我一些這種符號的光線,並提供給我一個有效的方法來解析它到PHP的鍵/值數組?

回答

2

任何方式你可以改變輸出?引用鍵名似乎允許它正常解析:

$test = '[{"text":"key 1","value":"value 1"},{"text":"key 2","value":"value 2"},{"text":"key 3","value":"value 3"}]'; 

    var_dump(json_decode($test)); 
+0

我想我可以str_replace文本:和值:並用雙引號括起來。 – 2009-08-28 22:30:33

0

它看起來像JavaScript語法(類似於JSON)。正則表達式是解析它的方法。剝去'['和']',然後在','上分開。然後分別解析每個對象。

+2

當一個字符串包含一個逗號時,問題就會出現。 – giorgian 2009-08-28 22:12:41

+0

分開},{就像我在下面的答案中指出的那樣。 – 2009-08-28 22:17:52

+0

正則表達式可以處理包含逗號的引號字符串。我已經做了很多次了。 – 2009-08-29 01:48:14

2

它類似於JSON,但顯然不完全符合規範。 PHP的json_decode功能只喜歡用雙引號鍵名:

// the following strings are valid JavaScript but not valid JSON 

// the name and value must be enclosed in double quotes 
// single quotes are not valid 
$bad_json = "{ 'bar': 'baz' }"; 
json_decode($bad_json); // null 

// the name must be enclosed in double quotes 
$bad_json = '{ bar: "baz" }'; 
json_decode($bad_json); // null 

// trailing commas are not allowed 
$bad_json = '{ bar: "baz", }'; 
json_decode($bad_json); // null 
-2

我從來沒有用過它,但也許給看看json_decode

+2

你有沒有讀過*這個問題? – nickf 2009-08-28 22:17:15

+0

天哪,你是對的。我想我不應該在這個小時回答問題。 – giorgian 2009-08-28 22:26:12

0

它看起來像一個自定義格式。在開頭和結尾處替換[{和}]分隔符。然後爆炸的「},{」,你會得到這樣的:

text:"key 1",value:"value 1" 
text:"key 2",value:"value 2" 
text:"key 3",value:"value 3" 

在這一點上,你可以遍歷數組中的每個元素,並使用的preg_match提取你的價值觀。

+2

從技術上講,沒有理由一個字符串不能包含'},{... ...即使它比包含一個字符串的字符串更不可能,' – 2009-08-28 22:24:08

+0

我選擇爆炸的原因},{是因爲肯定在示例輸出中顯示爲字段塊內值之間的分隔符。但是,我同意。 – 2009-08-29 04:43:07

0

它看起來幾乎就像一種數組式樣的數據容器 - 文本是索引,值是值。

$string = ....; 
$endArray = array() 
$string = trim($string,'[]'); 
$startArray = preg_split('/{.+}/'); 
// Array of {text:"key 1",value:"value 1"}, this will also skip empty conainers 
foreach($startArray as $arrayItem) { 
    $tmpString = trim($arrayItem,'{}'); // $tmp = text:"key 1",value:"value 1" 
    $tmpArray = explode(',',$tmpString); // $tmpArray = ('text: "key 1"', 'value: "value 1"') 
$endArray[substr($tmpArray[0],7,strlen($tmpArray[0])-1)] = substr($tmpArray[1],7,strlen($tmpArray[1])-1); 
} 
0

爲了讓您的JSON數據通過json_decode()接受,你可以使用下面的正則表達式:

function json_replacer($match) { 
    if ($match[0] == '"' || $match[0] == "'") { 
    return $match; 
    } 
    else { 
    return '"'.$match.'"'; 
    } 
} 

$json_re = <<<'END' 
/" (?: \\. | [^\\"])* "  # double-quoted string, with escapes 
| ' (?: \\. | [^\\'])* '  # single-quoted string, with escapes 
| \b [A-Za-z_] \w* (?=\s*:) # A single word followed by a colon 
/x 
END; 

$json = preg_replace_callback($json_re, 'json_replacer', $json); 

因爲比賽永遠不會重疊,一個字,接着冒號字符串永遠不會匹配裏面。


我還發現了不同PHP JSON實現之間的比較:

http://gggeek.altervista.org/sw/article_20061113.html

2

即樣品是有效YAML,這是JSON的超集。 YAML似乎有at least 3 PHP libraries

如果它實際上是YAML,那麼最好使用真正的YAML庫,而不是通過正則表達式運行它並將其扔到JSON庫中。 YAML支持其他功能(除了未加引號的字符串),如果您的ASP.NET後端使用,則不會在旅程中生存。