2011-03-03 21 views
77

¿Hay alguna biblioteca jQuery o javascript que genere una tabla dinámica dados los datos json? No quiero definir las columnas, la biblioteca debe leer las claves en el hash json y generar columnas.Convierta datos json en una tabla html

Por supuesto, puedo repetir los datos json y generar la tabla html. Solo quiero saber si existe una biblioteca de este tipo que simplemente pueda volver a utilizar.

+1

Bueno, gracias por las respuestas. Pero para satisfacer mis requisitos, escribí uno para mí. http://jsfiddle.net/manishmmulani/7MRx6/ –

+1

También puede usar este proyecto simple en Github: [Json-To-HTML-Table] (https://github.com/afshinm/Json-to-HTML-Table) –

+0

Creo que http://www.trirand.com/blog/ es lo que estás buscando. Toma JSON y lo convierte en una grilla. –

Respuesta

97

Gracias a todos por sus respuestas. I wrote one myself. Tenga en cuenta que esto usa jQuery.

Código fragmento:

var myList = [ 
 
    { "name": "abc", "age": 50 }, 
 
    { "age": "25", "hobby": "swimming" }, 
 
    { "name": "xyz", "hobby": "programming" } 
 
]; 
 

 
// Builds the HTML Table out of myList. 
 
function buildHtmlTable(selector) { 
 
    var columns = addAllColumnHeaders(myList, selector); 
 

 
    for (var i = 0; i < myList.length; i++) { 
 
    var row$ = $('<tr/>'); 
 
    for (var colIndex = 0; colIndex < columns.length; colIndex++) { 
 
     var cellValue = myList[i][columns[colIndex]]; 
 
     if (cellValue == null) cellValue = ""; 
 
     row$.append($('<td/>').html(cellValue)); 
 
    } 
 
    $(selector).append(row$); 
 
    } 
 
} 
 

 
// Adds a header row to the table and returns the set of columns. 
 
// Need to do union of keys from all records as some records may not contain 
 
// all records. 
 
function addAllColumnHeaders(myList, selector) { 
 
    var columnSet = []; 
 
    var headerTr$ = $('<tr/>'); 
 

 
    for (var i = 0; i < myList.length; i++) { 
 
    var rowHash = myList[i]; 
 
    for (var key in rowHash) { 
 
     if ($.inArray(key, columnSet) == -1) { 
 
     columnSet.push(key); 
 
     headerTr$.append($('<th/>').html(key)); 
 
     } 
 
    } 
 
    } 
 
    $(selector).append(headerTr$); 
 

 
    return columnSet; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 
<body onLoad="buildHtmlTable('#excelDataTable')"> 
 
    <table id="excelDataTable" border="1"> 
 
    </table> 
 
</body>

+0

Hola @ Manish-mulani esto no funcionó para mí, ¿podrías volver a comprobar – Nish

+1

@Nish ¿Has comprobado http://jsfiddle.net/manishmmulani/ 7MRx6 –

+1

Hola, traté de obtener los datos de una url, pero parece que no funciona –

7

Echa un vistazo JSON2HTMLhttp://json2html.com/ complemento para jQuery. Le permite especificar una transformación que convertiría su objeto JSON en una plantilla HTML. Utilice el constructor en http://json2html.com/ para obtener el objeto de transformación json para cualquier plantilla html deseada. En tu caso, sería una tabla con una fila que tiene una transformación siguiente.

Ejemplo:

var transform = {"tag":"table", "children":[ 
    {"tag":"tbody","children":[ 
     {"tag":"tr","children":[ 
      {"tag":"td","html":"${name}"}, 
      {"tag":"td","html":"${age}"} 
     ]} 
    ]} 
]}; 

var data = [ 
    {'name':'Bob','age':40}, 
    {'name':'Frank','age':15}, 
    {'name':'Bill','age':65}, 
    {'name':'Robert','age':24} 
]; 

$('#target_div').html(json2html.transform(data,transform)); 
+0

calculé que actualizaría el enlace aquí a http://json2html.com –

41

he vuelto a escribir el código de vainilla-js, utilizando métodos DOM para evitar la inyección HTML.

Demo

var _table_ = document.createElement('table'), 
    _tr_ = document.createElement('tr'), 
    _th_ = document.createElement('th'), 
    _td_ = document.createElement('td'); 

// Builds the HTML Table out of myList json data from Ivy restful service. 
function buildHtmlTable(arr) { 
    var table = _table_.cloneNode(false), 
     columns = addAllColumnHeaders(arr, table); 
    for (var i=0, maxi=arr.length; i < maxi; ++i) { 
     var tr = _tr_.cloneNode(false); 
     for (var j=0, maxj=columns.length; j < maxj ; ++j) { 
      var td = _td_.cloneNode(false); 
       cellValue = arr[i][columns[j]]; 
      td.appendChild(document.createTextNode(arr[i][columns[j]] || '')); 
      tr.appendChild(td); 
     } 
     table.appendChild(tr); 
    } 
    return table; 
} 

// Adds a header row to the table and returns the set of columns. 
// Need to do union of keys from all records as some records may not contain 
// all records 
function addAllColumnHeaders(arr, table) 
{ 
    var columnSet = [], 
     tr = _tr_.cloneNode(false); 
    for (var i=0, l=arr.length; i < l; i++) { 
     for (var key in arr[i]) { 
      if (arr[i].hasOwnProperty(key) && columnSet.indexOf(key)===-1) { 
       columnSet.push(key); 
       var th = _th_.cloneNode(false); 
       th.appendChild(document.createTextNode(key)); 
       tr.appendChild(th); 
      } 
     } 
    } 
    table.appendChild(tr); 
    return columnSet; 
} 
+0

¿Es posible hacer que esto funcione con un objeto json anidado? –

+0

@JanacMeena Creo que necesitarías tablas n-dimensionales para eso. – Oriol

+0

Eso es verdad. Tablas dentro de tablas. Además, descubrí mapas de árboles con zoom que permiten json anidado –

9

Puede utilizar jQuery plugin simple jPut

http://plugins.jquery.com/jput/

<script> 
$(document).ready(function(){ 

var json = [{"name": "name1","email":"[email protected]"},{"name": "name2","link":"[email protected]"}]; 
//while running this code the template will be appended in your div with json data 
$("#tbody").jPut({ 
    jsonData:json, 
    //ajax_url:"youfile.json", if you want to call from a json file 
    name:"tbody_template", 
}); 

}); 
</script> 

<table jput="t_template"> 
<tbody jput="tbody_template"> 
    <tr> 
     <td>{{name}}</td> 
     <td>{{email}}</td> 
    </tr> 
</tbody> 
</table> 

<table> 
<tbody id="tbody"> 
</tbody> 
</table>