2011-05-27 127 views
2

我在获取某个JSON数组的某些部分以显示在数据表中时遇到问题。使用jQuery数据表显示高级JSON数组的问题

这里是数组的1部分。

[ 
    { 
     "description": "Testing", 
     "lineStatus": "OK", 
     "persistent": true, 
     "pkgLineId": 102, 
     "pkgLineTree": { 
      "class": "models.PkgLineTree", 
      "entityId": 1, 
      "persistent": true, 
      "pkgLineTreeId": 1, 
      "treeId": { 
       "class": "models.Tree", 
       "entityId": 61, 
       "name": "Test", 
       "parentId": { 
        "class": "models.Tree", 
        "entityId": 57, 
        "name": "East", 
        "parentId": { 
         "class": "models.Tree", 
         "entityId": 52, 
         "name": "Test3", 
         "parentId": null, 
         "persistent": true, 
         "treeId": 52, 
         "webname": "coke" 
        }, 
        "persistent": true, 
        "treeId": 57, 
        "webname": "east" 
       }, 
       "persistent": true, 
       "treeId": 61, 
       "webname": "collegepark" 
      } 
     }, 
     "shortname": "Line 1A", 
     "statusStamp": 1305726508000, 
     "timezone": "US/Eastern", 
     "webname": "line1a" 
    }, 

这是我确定年代的JavaScript。

$(window).load(function() {  

    var insertedTable = $('#pkgLineTable').dataTable({ 
     "bJQueryUI": true, 
     "sPaginationType": "full_numbers", 
     "bPaginate": true, 
     "bLengthChange": true, 
     "bFilter": true, 
     "bSort": false, 
     "bInfo": true, 
     "bAutoWidth": false,  
     "bProcessing": true, 
     "bServerSide": false, 
     "sAjaxSource": 'json/pkglinelist', 
     "fnServerData": fnServerObjectToArray(['shortname', 'description', 'lineStatus', 'statusStamp'])   
    });  
}); 

继承人是我的回调函数。

fnServerObjectToArray = function (aElements) {  

    return function (sSource, aaData, fnCallback) { 
     $.ajax({ 
      "dataType": 'json', 
      "type": "GET", 
      "url": sSource, 
      "data": aaData, 
      "success": function (json) { 
       var a = []; 
       $.each(json, function(index, item) {  
        var inner = []; 
        for (var i = 0, iLen = aElements.length; i < iLen; i++) { 
         inner.push(item[aElements[i]]); 
        } 
        a.push(inner); 
       }); 
       json.aaData = a;    
       fnCallback(json); 
      } 
     }); 
    } 
} 

我可以绘制JSON数组的某些部分罚款。正如你所看到的,诸如description,lineStatus和statusStamp等工作正常。如果我深入它不起作用。这就是我所尝试过的。'

"fnServerData": fnServerObjectToArray(['pkgLineTree.class', 'pkgLineTree.entityId', 'lineStatus', 'statusStamp']) 

我试图把更多的信息放到数组中。它不工作。我猜测它可能与回调函数有关。

如果我尝试这些值,我会回来。

数据表警告:要求未知参数'0'为行'0'上的数据源。

只是想知道这里发生了什么。非常感谢。

回答

1

回调中的问题在于,它不会迭代到比一个层次更深的地步。这是因为item ['pkgLineTree.class']显然是未定义的(你应该像这样访问我:item ['pkgLineTree'] ['class']),所以你将未定义的值传递给数据表。 所以,你要努力一点点,这样的事情应该工作:

$.each(json, function(index, item) {  
     var inner = []; 
     for (var i = 0, iLen = aElements.length; i < iLen; i++) { 
      var str = aElements[i]; 
      var array = str.split('.');//this splits the Element if it has a dot 
      var subObject = null; 
      for (l = 0; l < array.length; l++){ 
       if (subObject){//if subObject has a value (this means it's not the firs iteration of the cycle, go one level deeper 
        subObject = subObject[array[l]]; 
       }else{//else go one level deep into item 
        subObject = item[array[l]]; 
       } 
      } 
      inner.push(subObject); 
     } 
     a.push(inner); 
}); 

如果它不工作,我会更好地尝试它,当我在家的时候,我心中已经创造了这个简化的小提琴,它作品.http://jsfiddle.net/njsYh/1/

编辑 - 我试过了,它适用于我。当然,您可以通过用点分隔每个级别来进一步深入。

+0

非常感谢。对不起,花了很长时间回来。刚刚测试过它。很棒!我能够一直挖到对象。 – 2011-05-29 17:34:48