2016-03-22 102 views
0

我已經使用json_encode($array);將數組轉換爲json。如何將一個PHP對象序列化爲一個JavaScript對象(非JSON)

[{"x":1418736600,"y":"82.2"},{"x":1418736900,"y":"82.2"}] 

但我真正需要的是一個JavaScript對象,像下面這樣:

[{x:1418736600,y:"82.2"},{x:1418736900,y:"82.2"}] 

要長話短說,我想一個JSON沒有引用的鑰匙,但它是最好避免解析什麼json_encode輸出並使用更直接的方式。

是否有可能在PHP中做到這一點?

+9

爲什麼你需要這個? 'json_encode'的輸出非常有效* JavaScript *代碼,如果您在預期值的位置使用它。在JavaScript中將鍵放在引號中是完全有效的。引用的鍵似乎不太可能使有效載荷變得更大,這是一個問題。 –

+0

請注意:JSON也是有效的Javascript,因爲Javascript對象文字鍵'可以被引用或不引用(儘管如果它們不是有效的標識符,它們必須被引用)。 – Paulpro

+0

編寫您自己的* Javascript對象文字*編碼器,它將成爲JSON編碼器的一個修改後的分支。實際上通過說,這絕對是無稽之談,因爲* JSON已經是Javascript *。 – deceze

回答

6

除了使有效載荷稍微更小,沒有必要這樣做。的json_encode輸出是有效的JavaScript代碼,如果用在一個預期值,,例如:

var x = <?php echo json_encode($array); ?>; 

引述的屬性鍵是有效的JavaScript。實際上,JSON作爲一個整體,是JavaScript文字語法的一個子集。

可能在結果處拋出正則表達式。它可能永遠不會是完美的(JSON,就像HTML一樣,不能用一個正則表達式正確解析),但是在一個有限的域中你可能會做到。例如,這裏有一個天真的版本,可能會爲許多數據集,包括你的榜樣工作,雖然它再次將以任何方式與所有數據集不工作:

<?php 
$str = json_encode($array); 
$str = preg_replace('/"([A-Za-z0-9_$]+)":/', '$1:', $str); 
?> 
var x = <?php echo json_encode($array); ?>; 

,它假定任何由剛AZ,az,0-9,_或$之間的雙引號後緊跟一個冒號是一個鍵並刪除引號。 (這不是一個有效的JavaScript identifier characters的完整列表,這只是一個例子。)

但是,我認爲節省是不值得費心的。

要做到這一點,當然,你必須做你自己的串行器。它不會那麼辛苦,只是一個處理遞歸到數組和對象的遞歸函數。它仍然可以使用json_encode作爲值。