2016-02-26 65 views
0

這可能是一個愚蠢的問題,但我正在學習json。我有一個視圖,我在頁面加載時將一個列表作爲json傳遞。但鑑於我無法通過密鑰獲得價值。任何人都可以請幫我。這裏是我的下面::json在grails中無法正常工作

我的視圖控制器動作>>>

def jsonObjectCreation(){ 
    def studentInfo = StudentInfo.getAll() 
    def students = new ArrayList<Map>() 
    studentInfo.each { 
     students.add([ 
       id: it.id, 
       name: it.name, 
       address: it.address, 
       age: it.age 
     ]) 
    } 
    [studentInfo: students as JSON] 
} 

我jsonObjectCreation查看>>>

<!DOCTYPE html> 
<html> 
<title>JSON Object</title> 
<body> 
<h2>JSON Object Creation in JavaScript</h2> 
<p id="demo"></p> 
<script> 
    var textResult = ""; 
    var obj = "${studentInfo}"; 
    alert("${studentInfo}"); 
    for(var i in obj) 
    { 
     textResult += obj[i].id + " : " + obj[i].name + "<br>"; 
    } 
    document.getElementById("demo").innerHTML = textResult; 
</script> 
</body> 
</html> 

,並提醒顯示此信息>>>

嘗試
[{&quot;id&quot;:1,&quot;name&quot;:&quot;Sumon&quot;,&quot;address&quot;:&quot;Dhaka&quot;,&quot;age&quot;:18},{&quot;id&quot;:2,&quot;name&quot;:&quot;Bappi&quot;,&quot;address&quot;:&quot;Mirpur&quot;,&quot;age&quot;:17},{&quot;id&quot;:3,&quot;name&quot;:&quot;Saad&quot;,&quot;address&quot;:&quot;Dhaka&quot;,&quot;age&quot;:19}] 

並在視圖中ID和名稱未定義

回答

1

默認情況下,Grails的發揮它的安全和轉義$ {} 表達式的GSP的所有內容。所有標準的GSP標籤也是安全的,默認爲 ,轉義任何相關的屬性值。

這就是爲什麼雙引號(「)被轉義爲&quot;。爲了解決這個問題要麼你可以刪除HTML通過config.groovy設置它完全逸出(壞主意),或處理它普惠制側。

處理它普惠制方面:

  1. 告訴Grails的內容是安全的,應該呈現原料:${raw(studentInfo)}使用${raw()}方法,你只能直接渲染ŧ他的內容。

  2. 使用<g:javascript>標籤來編寫您的內聯腳本代碼。但它會從您的內容中刪除任何不安全的HTML代碼。因此,如果您在gsp頁面上使用<g:javascript>alert("${studentInfo}");</g:javascript>,並且對應於某個鍵的其中一個數據包含<script>alert(123);</script>StName,則此標記將從數據中刪除腳本代碼部分。這對XSS攻擊非常有用,除非你真的想渲染它。

  3. 使用:var obj = "${raw(studentInfo)}".replace(/&quot;/g, '"')手動轉義報價與<script/>標記。雖然這不會刪除任何不安全的html,但如果您的任何鍵或值包含雙引號",它可能會中斷。

使用2nd或3rd方法將數據存儲到javascript變量後,現在需要將數據解析爲json對象。由於JavaScript變量不知道它是什麼類型的數據。所以簡單地做obj = JSON.parse(obj);在此之後,你可以遍歷JSON對象來獲取鍵和值,並繼續你的邏輯。

因此,使用g:javascript代碼如下:

<g:javascript> var textResult = ""; var obj = JSON.parse("${studentInfo}"); for (var i in obj) { textResult += obj[i].id + " : " + obj[i].name + "<br>"; } document.getElementById("demo_0").innerHTML = textResult; </g:javascript>

+0

非常感謝,很好地解釋。 –

1

問題不在於轉義值,而在於<script></script>部分; 改用:

<g:javascript> 
    alert("${studentInfo}"); 
</g:javascript> 
+0

感謝您的答覆。但是沒有任何運氣。 –

+0

您正在使用哪個版本的Grails? –

+0

我正在使用2.4.3 –

0

嘗試此,代替:

var obj = <%= studentInfo %>; 

上面的代碼不編碼的JSON,因爲"${studentInfo}"一樣。

0

我想你應該嘗試

var obj = JSON.parse("${studentInfo}")