json2html - 创建HTML表格

时间:2014-08-21 16:38:02

标签: javascript jquery json

我试图找到一个好的JS插件,它可以帮助我生成HTML <table />结构并用 JSON 数据填充它。

我找到了json2html,但遗憾的是,我没有在插件的官方网站上看到任何有用的示例或文档,也没有看到我可以查看的任何第三方网站。

我创建了一个function(),它将为我生成一些随机数据,我将在此演示示例中使用。在我将用于 json2html 的变量中存储JSON模板,并创建一个<div />,其ID将用于使用此插件解析JSON生成的数据。

// Demo function to generate random content
// ->
function generateChartData() {
 for (var i = 0; i < 5; i++) {
    var file_id = Math.floor(Math.random() * 90000) + 10000,
        file_name = 'Dummy File ' + Math.floor(Math.random() * 20) + 30 + '.zip',
        file_clicks = Math.round(Math.random() * 480) + 820,
        file_downloads = Math.round(Math.random() * 160) + 420,
        file_conversion = (file_clicks / file_downloads).toFixed(2),
        file_profit = Math.round(Math.random() * 120) + 310,
        file_cpa = (file_profit / file_downloads).toFixed(2),
        file_epc = (file_profit / file_clicks).toFixed(2);

    chartData.push({
      file_id: file_id,
      file_name: file_name,
      file_clicks: file_clicks,
      file_downloads: file_downloads,
      file_conversion: file_conversion,
      file_cpa: file_cpa,
      file_epc: file_epc,
      file_profit: file_profit
    });
  }

  // create variables but no values
  var total_clicks, total_downloads, total_conversion, total_profit, total_cpa, total_epc;
}
// <-

// Create html template for further json parsing
var template = {
  "tag": "table",
  "class": "table table-striped table-hover",
  "children": [
    {
      "tag": "thead",
      "id": "json-head",
      "children": [
        {
          "tag": "tr",
          "children": [
            {
              "tag": "th",
              "html": "ID"
            },
            {
              "tag": "th",
              "html": "File Name"
            },
            {
              "tag": "th",
              "html": "Clicks"
            },
            {
              "tag": "th",
              "html": "Downloads"
            },
            {
              "tag": "th",
              "html": "Conversion"
            },
            {
              "tag": "th",
              "html": "Average CPA"
            },
            {
              "tag": "th",
              "html": "EPC"
            },
            {
              "tag": "th",
              "html": "Profit"
            }
          ]
        }
      ]
    },
    {
      "tag": "tbody",
      "id": "json-body",
      "children": [
        {
          "tag": "tr",
          "children": [
            {
              "tag": "td",
              "html": "${file_id}"
            },
            {
              "tag": "td",
              "html": "${file_name}"
            },
            {
              "tag": "td",
              "html": "${file_clicks}"
            },
            {
              "tag": "td",
              "html": "${file_downloads}"
            },
            {
              "tag": "td",
              "html": "${file_conversion}"
            },
            {
              "tag": "td",
              "html": "${file_cpa}"
            },
            {
              "tag": "td",
              "html": "${file_epc}"
            },
            {
              "tag": "td",
              "html": "${file_profit}"
            }
          ]
        }
      ]
    },
    {
      "tag": "tfoot",
      "id": "json-foot",
      "children": [
        {
          "tag": "tr",
          "children": [
            {
              "tag": "td",
              "colspan": "2",
              "html": "Total / Average"
            },
            {
              "tag": "td",
              "html": "${total_clicks}"
            },
            {
              "tag": "td",
              "html": "${total_downloads}"
            },
            {
              "tag": "td",
              "html": "${total_conversion}"
            },
            {
              "tag": "td",
              "html": "${total_cpa}"
            },
            {
              "tag": "td",
              "html": "${total_epc}"
            },
            {
              "tag": "td",
              "html": "${total_profit}"
            }
          ]
        }
      ]
    }
  ]
};

// Empty array for json data
var chartData = [];

// Calling DEMO function to generate json data
generateChartData();

// Parse json data and generate html
$("#json-parse").json2html(chartData, template);

但是,您可能会注意到我的 JSON 模板或 json2html 调用出了问题。它会为每个JSON数据解析创建无效表并生成表。所以不幸的是,这不是我想要的东西。

我的想法是创建以下模板并将所需信息解析为<tbody />&amp; <tfoot />但不是重新创建它们。

<table class="table table-striped table-hover">
<thead id="json-head">
    <tr>
        <th>ID</th>
        <th>File Name</th>
        <th>Clicks</th>
        <th>Downloads</th>
        <th>Conversion</th>
        <th>Average CPA</th>
        <th>EPC</th>
        <th>Profit</th>
    </tr>
</thead>

<tbody id="json-body">
    <tr>
        <td>${file_id}</td>
        <td>${file_name}</td>
        <td>${file_clicks}</td>
        <td>${file_downloads}</td>
        <td>${file_conversion}</td>
        <td>${file_cpa}</td>
        <td>${file_epc}</td>
        <td>${file_profit}</td>
    </tr>
</tbody>

<tfoot id="json-foot">
    <tr>
        <td colspan="2">Total / Average</td>
        <td>${total_clicks}</td>
        <td>${total_downloads}</td>
        <td>${total_conversion}</td>
        <td>${total_cpa}</td>
        <td>${total_epc}</td>
        <td>${total_profit}</td>
    </tr>
</tfoot>

不幸的是,我无法提供JSFiddle,因为我无法找到任何CDN。但是这里有截图,它将显示不良后果的结果。

json2html - Bad outcome

我知道这是我的JSON结构或插件调用我没有正确设置,但如果你不介意帮助我在这里。这真的很头疼,但也可以帮助其他用户。

1 个答案:

答案 0 :(得分:2)

json2Html 在循环中生成你的模板,计数器等于你的json对象数。所以你看到的结果没有错。如果你不想重复你的表的页眉和页脚只使用那些作为其他模板的对象,其中包含一个数组。
更新:感谢@Volune example

// Create html template for further json parsing
        var headertemplate = {
            "tag": "thead",
              "id": "json-head",
              "children": [
                {
                  "tag": "tr",
                  "children": [
                    {
                      "tag": "th",
                      "html": "ID"
                    },
                    {
                      "tag": "th",
                      "html": "File Name"
                    },
                    {
                      "tag": "th",
                      "html": "Clicks"
                    },
                    {
                      "tag": "th",
                      "html": "Downloads"
                    },
                    {
                      "tag": "th",
                      "html": "Conversion"
                    },
                    {
                      "tag": "th",
                      "html": "Average CPA"
                    },
                    {
                      "tag": "th",
                      "html": "EPC"
                    },
                    {
                      "tag": "th",
                      "html": "Profit"
                    }
                  ]
                }
              ]
        }
        var footertemplate = { 
              "tag": "tfoot",
              "id": "json-foot",
              "children": [
                {
                  "tag": "tr",
                  "children": [
                    {
                      "tag": "td",
                      "colspan": "2",
                      "html": "Total / Average"
                    },
                    {
                      "tag": "td",
                      "html": "${total_clicks}"
                    },
                    {
                      "tag": "td",
                      "html": "${total_downloads}"
                    },
                    {
                      "tag": "td",
                      "html": "${total_conversion}"
                    },
                    {
                      "tag": "td",
                      "html": "${total_cpa}"
                    },
                    {
                      "tag": "td",
                      "html": "${total_epc}"
                    },
                    {
                      "tag": "td",
                      "html": "${total_profit}"
                    }
                  ]
                }
              ]
        }
        var template = {
          "tag": "table",
          "class": "table table-striped table-hover",
          "children": [ 
            {
              "tag": "tbody",
              "id": "json-body",
              "children": [
                {
                  "tag": "tr",
                  "children": [
                    {
                      "tag": "td",
                      "html": "${file_id}"
                    },
                    {
                      "tag": "td",
                      "html": "${file_name}"
                    },
                    {
                      "tag": "td",
                      "html": "${file_clicks}"
                    },
                    {
                      "tag": "td",
                      "html": "${file_downloads}"
                    },
                    {
                      "tag": "td",
                      "html": "${file_conversion}"
                    },
                    {
                      "tag": "td",
                      "html": "${file_cpa}"
                    },
                    {
                      "tag": "td",
                      "html": "${file_epc}"
                    },
                    {
                      "tag": "td",
                      "html": "${file_profit}"
                    }
                  ]
                }
              ]
            } 
          ]
        }; 

    // Empty array for json data
    var chartData = [];

    // Calling DEMO function to generate json data
    generateChartData(); 
    // Parse json data and generate html
    $("#json-parse").json2html(chartData[0], headertemplate);
    $("#json-parse").json2html(chartData, template);
    $("#json-parse").json2html(chartData[0], footertemplate); //use your total json object with one array inside, instead chartData[0];