【问题标题】:jQuery datatables json initialisation invalid jsonjQuery数据表json初始化无效json
【发布时间】:2011-02-04 15:27:57
【问题描述】:

我正在尝试使用数据库中保存的 json 格式化 jQuery DataTable。我在响应的隐藏字段中将 json 传递给客户端。然后我尝试使用以下 js 初始化数据表:

function initDataTables(){

        $('.datatable').each(function(i) {
            // Look for a hidden field containing the json to use when initialising the datatable
            var hiddenfieldkey = $(this).attr('id') + 'jsoninit'
            var hiddenfield = $('#' + hiddenfieldkey);
            if (hiddenfield.length > 0) {
                // We have found some 'special' json formatting, so use it
                var jsoninittext = $(hiddenfield).val();
                alert(jsoninittext);
                var json = $.parseJSON(jsoninittext);
                alert('point two');
                $(this).dataTable(json);

            }
            else {
                // Standard datatable formatting
                $(this).dataTable({
                    "bJQueryUI": true,
                    "sPaginationType": "full_numbers",
                    "aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
                });
            }
        });

        initDataTableButtons();

    }

这一切都适用于以下 json(我刚刚复制了用于填充 db 中的 json init 表的 sql:

update query set jQueryDatatableJSONInit=   
'{
"iDisplayLength": 25
,"bJQueryUI": true
,"sPaginationType": "full_numbers"
,"aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
,"aoColumnDefs": [ 
        { "bVisible": false,  "aTargets": [ 0,3,4 ] }
        ,{ "sClass": "nowrap", "aTargets": [ 2 ] }
        ,{ "iDataSort": 0, "aTargets": [ 1 ] }
        ,{ "bSortable": false, "aTargets": [ 2 ] }
        ]
}'
where id ='336f7ea2-173a-4b8f-af30-e217d1e1c628' 

但是,当我的 json 包含函数时会出现问题,如下所示(与之前相同,但包含包含函数的 fnRender 行):

update query set jQueryDatatableJSONInit=   
'{
"iDisplayLength": 25
,"bJQueryUI": true
,"sPaginationType": "full_numbers"
,"aLengthMenu": [[10, 25, 50, -1], [10, 25, 50, "All"]]
,"aoColumnDefs": [ 
        { "fnRender": function ( oObj ) { return oObj.aData[2] +'' ''+ oObj.aData[3]+'' ''+ oObj.aData[4];},"aTargets": [ 2 ]}
        ,{ "bVisible": false,  "aTargets": [ 0,3,4 ] }
        ,{ "sClass": "nowrap", "aTargets": [ 2 ] }
        ,{ "iDataSort": 0, "aTargets": [ 1 ] }
        ,{ "bSortable": false, "aTargets": [ 2 ] }
        ]
}'
where id ='336f7ea2-173a-4b8f-af30-e217d1e1c628' 

以下行失败(出现 Invalid JSON 错误):

var json = $.parseJSON(jsoninittext);

因此第二个警报(第二点)永远不会运行,因此它不会到达 dataTable() 函数。在我看来,好像函数定义(包含大括号)导致 json 无效。 有谁知道我如何格式化数据表初始化 json,以便它可以继续包含 jquery 数据表所期望的函数定义,但这仍然是有效的 json(我可以使用某种转义)吗? 非常感谢。

【问题讨论】:

    标签: jquery json parsing datatable


    【解决方案1】:

    JSON 序列化不适用于存储函数。 JSON,就其本质而言,是一种序列化对象内数据成员的方式,而不是其内部流程。请参阅“值”标题下的http://www.json.org/(向下三位数),了解哪些对象打算使用 JSON 进行序列化。

    您可以将函数括在引号中以强制将其转换为字符串并对该数据成员运行 eval,但我通常不会鼓励开发人员使用 eval()。

    【讨论】:

    • 非常感谢您提供的信息,我围绕问题进行了编码(见下文)
    【解决方案2】:

    最后,如果没有 eval,我无法让它工作,我想避免这种情况。我的解决方法是将 fnRender 功能(我将几列合并为一列)封装到服务器层,以便服务器合并列,因此无需使用 fnRender 来合并它们。可耻,但你去吧。

    【讨论】:

      猜你喜欢
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 1970-01-01
      • 2014-05-03
      • 2017-04-04
      • 2011-03-13
      相关资源
      最近更新 更多