这可能是一个愚蠢的问题,但我正在学习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视图&gt;&gt;&gt;
<!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>
警报显示此消息&gt;&gt;&gt;
[{"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未定义
答案 0 :(得分:1)
问题不是逃避价值,而是使用<script></script>
部分;
改为使用:
<g:javascript>
alert("${studentInfo}");
</g:javascript>
答案 1 :(得分:1)
试试这个,而不是:
var obj = <%= studentInfo %>;
上面的代码不像"${studentInfo}"
那样对JSON进行编码。
答案 2 :(得分:1)
默认情况下,Grails会安全地播放它并转义$ {}中的所有内容 GSP中的表达方式。所有标准GSP标签也是安全的 默认情况下,转义任何相关的属性值。
这就是双引号(“)以"
转义的原因。要处理此问题,您可以通过在config.groovy
中设置来完全删除html转义(错误的想法强>),或在gsp一侧处理。
在gsp方面处理它:
告诉Grails内容是安全的,应该是原始的:${raw(studentInfo)}
。使用${raw()}
方法,您只能直接呈现内容。
使用<g:javascript>
标记编写内联脚本代码。但它会从您的内容中删除任何不安全的HTML代码。因此,如果您在gsp页面上使用<g:javascript>alert("${studentInfo}");</g:javascript>
并且其中一个数据对应的键包含<script>alert(123);</script>StName
,那么此标记将从数据中删除脚本代码部分。除非你真的想渲染它,否则这对XSS攻击非常有帮助。
使用<script/>
在var obj = "${raw(studentInfo)}".replace(/"/g, '"')
标记中手动转义引号。虽然这不会删除任何不安全的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>
答案 3 :(得分:0)
我想你应该试试
var obj = JSON.parse("${studentInfo}")