json在grails中无法正常工作

时间:2016-02-26 09:57:17

标签: json grails

这可能是一个愚蠢的问题,但我正在学习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;

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

4 个答案:

答案 0 :(得分:1)

问题不是逃避价值,而是使用<script></script>部分; 改为使用:

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

答案 1 :(得分:1)

试试这个,而不是:

var obj = <%= studentInfo %>;

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

答案 2 :(得分:1)

  

默认情况下,Grails会安全地播放它并转义$ {}中的所有内容   GSP中的表达方式。所有标准GSP标签也是安全的   默认情况下,转义任何相关的属性值。

这就是双引号(“)以&quot;转义的原因。要处理此问题,您可以通过在config.groovy中设置来完全删除html转义(错误的想法),或在gsp一侧处理。

在gsp方面处理它:

  1. 告诉Grails内容是安全的,应该是原始的:${raw(studentInfo)}。使用${raw()}方法,您只能直接呈现内容。

  2. 使用<g:javascript>标记编写内联脚本代码。但它会从您的内容中删除任何不安全的HTML代码。因此,如果您在gsp页面上使用<g:javascript>alert("${studentInfo}");</g:javascript>并且其中一个数据对应的键包含<script>alert(123);</script>StName,那么此标记将从数据中删除脚本代码部分。除非你真的想渲染它,否则这对XSS攻击非常有帮助。

  3. 使用<script/>var obj = "${raw(studentInfo)}".replace(/&quot;/g, '"')标记中手动转义引号。虽然这不会删除任何不安全的HTML,但如果您的任何键或值包含双引号",它可能会中断。

  4. 使用第二种或第三种方法将数据存储到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}")