2014-03-19 87 views
1

我有一些信息從PHP傳遞到JavaScript(不是AJAX調用)來初始化一些動態內容。JSON是否解析?

在服務器端

echo 'var ' . $controlID . '_json = JSON.parse(\'' . $control->getOptions() . '\');'; 

其中$控制 - > getOptions是

public function getOptions() { 
    //some code to build an array here 
    return json_encode($somearray); 
} 

這會導致JavaScript代碼的瀏覽器

var ControlName_json = JSON.parse('/*JSON OUTPUT HERE */'); 

現在以下,這會產生出於某種原因的錯誤。 (錯誤,意外的令牌a)。我查了一下,我用的瀏覽器有JSON。 然而,這樣沒有問題:

echo 'var ' . $controlID . '_json = ' . $control->getOptions() ';'; 

這有什麼錯作爲對象直接分配變量?不知怎的,這可能會在路上'破壞'javascript嗎?

爲了完整性,導致問題的特定JSON在下面,但是由於它是由json_encode創建的,我不確定它是否重要。

{"o0":[{"text":"aguapop","value":"aguapop","selected":false,"parentID":0,"attributes":" value=\"aguapop\""},{"text":"default","value":"default","selected":false,"parentID":0,"attributes":" value=\"default\""},{"text":"fluid","value":"fluid","selected":false,"parentID":0,"attributes":" value=\"fluid\""},{"text":"fresh","value":"fresh","selected":false,"parentID":0,"attributes":" value=\"fresh\""},{"text":"gel","value":"gel","selected":false,"parentID":0,"attributes":" value=\"gel\""},{"text":"professional","value":"professional","selected":false,"parentID":0,"attributes":" value=\"professional\""},{"text":"professional-rtl","value":"professional-rtl","selected":false,"parentID":0,"attributes":" value=\"professional-rtl\""},{"text":"silverwolf","value":"silverwolf","selected":false,"parentID":0,"attributes":" value=\"silverwolf\""},{"text":"wood","value":"wood","selected":false,"parentID":0,"attributes":" value=\"wood\""}]} 
+0

我沒有在你的php中看到json_decode()函數。但我看到json.parse()這不是如何解碼php中的JSON對象。也許我只是誤讀? – KevBot

+0

我不需要解碼PHP中的json。 PHP正在向javascript發送關聯數組,但是JSON.parse()會在輸出中引發錯誤。我是否需要使用JSON.parse(),還是可以原生地發送它? – serakfalcon

回答

1

在JS中,不需要解析JSON,只需將其直接分配給一個變量即可。用你的JSON例子在JSfiddle上爲我工作:

echo 'var ' . $controlID . '_json = '. $control->getOptions() . ';'; 

在JSON.parse中拋出並且在意外標記上失敗。

+0

這樣做是否有任何可能的問題? – serakfalcon

+0

好吧,我想 – serakfalcon

1

的問題是在解析"attributes"屬性,其中非是一個有效的JSON值,例如你有:

"attributes":" value=\"wood\" 
在你的JSON字符串

,當我把它改成:

"attributes":" value='wood'" 

"attributes":" value=\'wood\'" 

問題得到有效解決。

其他的方式是不使用JSON.pars E,但在你的JSON的"attributes"值是無效的JSON.parse得到解析,但它可能是一個有效的JavaScript對象,所以你可以不喜歡它:

echo 'var ' . $controlID . '_json = ' . $control->getOptions() . ';'; 
+0

JSON直接從json_encode傳遞,有沒有什麼辦法來控制json_encode的輸出? – serakfalcon

+0

@serakfalcon:您可以使用字符串函數手動修改它,在PHP或JavaScript中,但我不認爲這是一個好習慣。 –

+0

@serakfalcon:在編碼之前的某個地方,你將'attributes'值傳遞給對象,爲什麼不傳遞像''attributes'這樣的實際值:「wood」'而不是'「attributes」:「 value = \「wood \」' –

1

您應該將JSON編碼爲最後一步。運行這個簡單的例子,並檢查你的JavaScript控制檯。

<?php 
$cars = array 
(
array("Volvo",22,18), 
array("BMW",15,13), 
array("Saab",5,2), 
array("Land Rover",17,15) 
); 
//print_r($cars); 
?> 

<!doctype html> 
<html> 
<head> 
<meta charset="UTF-8"> 
<title>JSON Parse</title> 
<script> 
var output = '<?php echo json_encode($cars); ?>'; 
console.log(JSON.parse(output)); 
</script> 
</head> 
<body> 
</body> 
</html> 
+0

如果我計劃將輸出直接傳遞給瀏覽器,那麼類函數內的編碼更安全 - 這種方式我不記得每次打電話時都要編碼輸出這個函數,當我編碼函數時它應該沒有問題,它也不能解決真正的問題,它是一個數組值,類似於'value =「test」id =「StyleID」'這顯然是json_encode不妥善處理。 – serakfalcon