【问题标题】:Sending JSON to javascript on GSP在 GSP 上将 JSON 发送到 javascript
【发布时间】:2014-06-08 19:02:32
【问题描述】:

我正在使用 Grails 2.3.7,并且我有一个控制器操作如下:

def testData(){
    def result = [:]
    result['name'] = "Sales"
    result['type'] = "bar"
    result['data'] = [5, 20, 45, 10, 10, 20]
    [data: result as JSON]
}

在 testData.gsp 中,我想在 javascript 中获取 JSON 对象:

<script>
    $(document).ready(function(){
        var data = JSON.parse(${data});
    })
</script>

然后我遇到了一个异常:

Uncaught SyntaxError: Unexpected token {

上线:

var data = JSON.parse({&quot;name&quot;:&quot;Sales&quot;,&quot;type&quot;:&quot;bar&quot;,&quot;data&quot;:[5,20,45,10,10,20]});

看起来 JSON 搞砸了。我认为它曾经以这种方式工作。也许它是新的Grails?我怎样才能解决这个问题?谢谢。

更新: 问题解决了。请参阅已接受答案中的 cmets。

更新 2: 当我今天检查应用程序时,它又失败了。我使用“原始”方法完成了文档所需的操作,但没有运气。一种解决方法是使用“每页编码”。这是我彻底测试过的。它确实有效。

【问题讨论】:

  • @dmahapatro 我都试过了。我得到了新的异常:Uncaught SyntaxError: Unexpected token &
  • 您可以使用g:set 设置变量,${data} 会为您提供 JSON 字符串。您希望在脚本块中使用它的任何原因。
  • @dmahapatro 我需要将 json 发送到 javascript 以呈现一些数据。

标签: javascript json grails


【解决方案1】:

问题在于 JSON 被编码为 HTML。请尝试以下方法:

控制器

def testData() {
    def result = [:]
    result['name'] = "Sales"
    result['type'] = "bar"
    result['data'] = [5, 20, 45, 10, 10, 20]
    [data: result as JSON]
}

普惠制

<script>
    var data = ${raw(data)};
</script>

你不需要$(document).ready,因为 JS 代码

var data = ${raw(data)};

在服务器端生成

【讨论】:

  • 嗨,唐,我试过了。 Firebug 显示 var data = {&amp;quot;name&amp;quot;:&amp;quot;Sales&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;bar&amp;quot;,&amp;quot;data&amp;quot;:[5,20,45,10,10,20]}; 那么我的服务器端代码有问题吗?
  • Thx @Don 这似乎与Grails Security 有关,并且所有新的 grails 应用程序都将 ${} 中的值编码为 html。我将只使用 ${raw(data)} 并保持编解码器不变。很好的收获,感谢您的帮助!
【解决方案2】:

工作solution:

def action() {
  [data: data as JSON]
}

普惠制页面:

<g:applyCodec encodeAs="none">
    var data = ${data};
</g:applyCodec>

【讨论】:

    【解决方案3】:

    encodeAsJSON() 方法非常适合将 JSON 数据输出到 JavaScript:

    控制器

    def testData() {
       def data = [name: "Sales", values: [5, 20, 45]]
       [data: data]
       }
    

    查看 (GSP)

    <script>
    var data1 = ${raw(data)};  //{name=Sales, values=[5, 20, 45]}
    var data2 = ${raw(data as grails.converters.JSON)};  //{&quot;name&quot;:&quot;Sales...
    var data3 = ${data.encodeAsJSON()};  //{"name":"Sales","values":[5,20,45]}  CORRECT!
    </script>
    

    在 Groovy 对象上使用 raw() 不会产生与 JavaScript 兼容的输出(请参阅 data1),并且在 JSON 转换器之后使用它会导致不需要的 &amp;quot; 编码(请参阅 data2)。使用encodeAsJSON() 会产生正确的输出(请参阅data3)。

    文档:
    http://grails.org/doc/latest/guide/security.html#codecs

    更新:
    我已经改用 taglib 了:

    out << "<script>const data = " + raw((data as JSON) as String) + ";</script>"
    

    【讨论】:

    • encodeAsJSON() 产生与 data2 相同的结果,你知道为什么吗?
    • 我不确定encodeAsJSON() 发生了什么变化,但您可以尝试使用 taglib 路线(请参阅上面的更新)。适用于 Grails 3.0。
    • 用 grails 3.2.8 测试过,taglib 版本就像一个魅力。
    【解决方案4】:

    以下对我使用 Grails 2.4.3 有效:

    控制器:

    def result = [:]
    result['type'] = "bar"
    result['data'] = [5, 20, 45]
    
    model: [data: result as JSON]
    

    普惠制:

    <script>
    // this worked!
    var data = ${raw(data as String)};
    </script>
    

    产生了预期的结果:

    <script>
    // this worked!
    var data = {"type":"bar","data":[5,20,45]};
    </script>
    

    Dónal 接受的答案对我不起作用:

    控制器(与我上面的工作示例相同)

    GSP(无效):

    <script>
    // did NOT work!!
    var data = ${raw(data)};
    </script>
    

    产生了同样糟糕的结果:

    <script>
    // did NOT work!!
    var data = {&quot;type&quot;:&quot;bar&quot;,&quot;data&quot;:[5,20,45]};
    </script>
    

    【讨论】:

    • 我在 Grails 3 中遇到了同样的问题,这为我解决了。
    【解决方案5】:

    这在 grails 3.1.9 中对我有用。

    控制器:

    def result = [:]
    result['type'] = "bar"
    result['data'] = [5,20,45]
    result['key'] = token
    
    [data:result as JSON]
    

    普惠制:

    <script>
    
    var data = '${raw(data as String)}';
    var json = JSON.parse(data);
    alert(json.type);
    
    var authorization = json.key;
    
    </script>
    

    【讨论】:

      【解决方案6】:

      并非所有 grails 版本都支持 raw() 方法或 g:applyCodec taglib。

      解决办法是使用 块来避免转义

       <%= users.collect({id:it.id,value:it.name}) as grails.converters.JSON%>
      

      或

      <%= someJsString.encodeAsJavascript() %>
      

      但最佳做法是避免在 GSP 中使用服务器端生成的 JSON,并重构为通过 ajax 请求接收相同的 JSON

      【讨论】:

      • 在 grails 3.3.2 中工作
      【解决方案7】:

      在 testData.gsp 中添加

      <%@page expressionCodec="none" %>
      

      在脚本中

      <script>
         $(document).ready(function(){
          var data = ${data};
      })
      </script>
      

      【讨论】:

        【解决方案8】:

        这也可能会有所帮助,将数据作为简单模型传递并将其解析为 gsp 中的 JSON。

        def testData() {
            def result = [:]
            ...
            [data: result]
        }
        

        正在查看

        <%! import grails.converters.JSON %>
        ...
        <script>
        function parseModelToJS(jsonString)
        {
         jsonString=jsonString.replace(/\"/g,'"');
         var jsonObject=$.parseJSON(jsonString);
         return jsonObject
        }
        
        $(document).ready(function(){
         var data=parseModelToJS('${data as JSON}');
         console.log(data);
        });
        </script>
        

        http://www.oodlestechnologies.com/blogs/Parse-model-to-json-on-gsp-in-grails

        【讨论】:

          【解决方案9】:

          你可以这样做,

          import groovy.json.*
          Map testMap = ['name': 'Test']
          String jsonData = new JsonBuilder(testMap).toPrettyString()
          render(view: view, model: ["data": jsonData], params: [:])
          

          在您的 gsp 中:

           <script>
              var data = ${raw(data)};
          </script>
          

          简单..

          【讨论】:

            猜你喜欢
            • 2023-04-08
            • 2015-12-13
            • 1970-01-01
            • 1970-01-01
            • 2016-10-04
            • 1970-01-01
            • 1970-01-01
            • 2014-06-26
            • 2015-07-07
            相关资源
            最近更新 更多