我正在学习JSON。我有一个视图,在页面加载时,我以JSON的形式传递一个列表。但是在视图中,我无法通过键获取值。下面是我的尝试:
我的视图控制器操作:
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>
警报显示以下消息:
[{"id":1,"name":"Sumon","address":"Dhaka","age":18},{"id":2,"name":"Bappi","address":"Mirpur","age":17},{"id":3,"name":"Saad","address":"Dhaka","age":19}]
并且在视图中id和name未定义。
4条答案
按热度按时间nnvyjq4y1#
默认情况下,Grails是安全的,会转义GSP中${}表达式中的所有内容,所有标准GSP标记也是安全的,会转义任何相关的属性值。
这就是为什么双引号(“)被转义为
"
。要处理这个问题,你可以通过在config.groovy
中设置它来完全删除html转义(坏主意),或者在gsp端处理它。要在GSP端处理:
1.告诉Grails内容是安全的,应该以原始形式呈现:
${raw(studentInfo)}
。使用${raw()}
方法只能直接呈现内容。1.使用
<g:javascript>
标签来编写你的内联脚本代码。但是它会从你的内容中移除任何不安全的html代码。所以如果你在你的gsp页面上使用<g:javascript>alert("${studentInfo}");</g:javascript>
,并且其中一个对应于键的数据包含<script>alert(123);</script>StName
,那么这个标签会从数据中移除脚本代码部分。这对抵御XSS攻击非常有帮助,除非你真的想呈现它。1.使用以下命令手动转义
<script/>
标记中的引号:虽然这不会删除任何不安全的html,但如果您的任何键或值包含双引号,它可能会中断。在你用第二种或第三种方法把数据存储到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>
3npbholx2#
问题不在于转义值,而在于
<script></script>
节;改为使用:ozxc1zmp3#
试试这个:
上面的代码不像
"${studentInfo}"
那样对JSON进行编码。mbzjlibv4#
我觉得你应该试试