在 GSP 页面中传递 JSON

pass JSON in GSP page

我正在尝试将 JSON 数据传递到 GSP 页面并显示 table。

预计JSON:

{
  "data": [
    [
      "Tiger Nixon",
      "System Architect",
      "Edinburgh"
    ]
]}

我正在尝试使用:

def resp = [data:["System", "One", "Test"]]

[resp: resp]

并显示:

<g:javascript>
  $(document).ready(function() {
  $('#example').DataTable( {
     "ajax": "${raw(resp)}"
  } ); } ); 
</g:javascript>

但是页面源代码中的结果是:

$(document).ready(function() {
    $('#example').DataTable( {
        "ajax": "\u007bdata=\u005bSystem\u002c One\u002c Test\u005d\u007d"
    } );

如何正确传递?

UPD1:

当我传递一个字符串时它起作用了:

查看:

 <g:javascript>
        var str = '${raw(resp)}';
        var json = JSON.parse(str);
        $(document).ready(function() {
        $('#example').DataTable( {
           data: json
        } );
    } );
    </g:javascript>

控制器:

def resp = '[[ \"Tiger Nixon\", \"System Architect\", \"Edinburgh\"]]'    
respond resp, model:[resp: resp]

页面源代码:

<script type="text/javascript">

    var str = '[[ "Tiger Nixon", "System Architect", "Edinburgh"]]';
    var json = JSON.parse(str);
    $(document).ready(function() {
    $('#example').DataTable( {
       data: json
    } );
} );

但是当我试图通过

def resp = [["Tiger Nixon", "System Architect", "Edinburgh"]]

它产生一个错误

[resp: resp]

更改为:

[resp: resp as JSON]

已解决: 控制器:

def obj = [["Tiger Nixon", "System Architect", "Edinburgh"]] 
String resp = obj.encodeAsJSON();
respond resp, model:[resp: resp]

encodeAsJSON() 在“”中生成正确的输出

查看:

<g:javascript>
    var str = '${raw(resp)}';
     var json = JSON.parse(str);

    $(document).ready(function() {
    $('#example').DataTable( {
       data: json
    } );
} );
</g:javascript>

虽然你已经让它工作了,但我认为你可能正在将你的数据处理成非标准方法,以便以一种迂回的方式获得结果。

我将尝试解释另一种方法和一种可以在您的服务中使用的方法来构建您要发送的地图,然后在控制器中呈现:

def resp = [data:["System", "One", "Test"]]

你所拥有的是:

//A groovy map object
Map resp = [:]
//It has one element called data which contains a list
resp.data=[]
//add in system
resp.data << 'system'
resp.data << 'One'
resp.data << 'Test'

这可能是由某些 findBy 或其他形式的数据库查找生成的列表,在这种情况下 resp.data 就变成了列表

def myList=['system','one','Test']
resp.data=myList

现在我们已经恢复了您拥有的对象

def resp = [data:["System", "One", "Test"]]
or 
Map resp = [data:["System", "One", "Test"]]

如果你现在做

String myResp = (resp as JSON).toString()

您正在使用 groov 作为 JSON 首先将该映射转换为 json,最后将 JSON 对象转换为字符串

您可以在服务中有一个函数,该函数 returns 将 JSON 或完成的字符串对象发送给控制器,直接动态构建数据。

我只给了我的两分钱,因为正在看:

def obj = [["Tiger Nixon", "System Architect", "Edinburgh"]] 

您正在构建一些奇怪的地图,只是为了匹配您的 java script which I think could possibly do with improvement 以直接使用给定的地图而不是这个奇怪的对象:

<g:javascript>
    var str = '${raw(resp)}';
     var jsonData = JSON.parse(str);
var jsonResult = jsonData.data;
    $(document).ready(function() {
    $('#example').DataTable( {
       data: jsonResult
    } );
} );
</g:javascript>

我认为现在 jsonResult 将只容纳您正在查看的对象。我提供了一个 link 来改进 javascript 到我的一个插件中的搜索结果。我用它和 wschat 插件做了一些 json 的事情。

没有测试以上任何一项,只是对比我是如何做的与你的风格相比,你的风格看起来不寻常,可能不符合任何标准,而且构建更大的动态数据集的难度更大