JSON在Grails中未按预期工作

goqiplq2  于 2023-03-04  发布在  其他
关注(0)|答案(4)|浏览(153)

我正在学习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>

警报显示以下消息:

[{&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和name未定义。

nnvyjq4y

nnvyjq4y1#

默认情况下,Grails是安全的,会转义GSP中${}表达式中的所有内容,所有标准GSP标记也是安全的,会转义任何相关的属性值。
这就是为什么双引号(“)被转义为&quot;。要处理这个问题,你可以通过在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>

3npbholx

3npbholx2#

问题不在于转义值,而在于<script></script>节;改为使用:

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

ozxc1zmp3#

试试这个:

var obj = <%= studentInfo %>;

上面的代码不像"${studentInfo}"那样对JSON进行编码。

mbzjlibv

mbzjlibv4#

我觉得你应该试试

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

相关问题