我应该如何用JSON表示表格数据?

时间:2011-05-02 22:49:45

标签: javascript jquery json

我正在编写一个API,用于通过JSON从JDBC连接的Java Servlet中检索数据。我选择使用JSON,因为我们想要对浏览器中的数据进行排序和其他操作,我们将从跨域访问数据。

由于我本质上是在JavaScript中进行SQL查询,因此返回的数据本质上是表格式的。我开始编写这个,以便您返回列标签列表,然后返回值数组,例如:

{
  "columns": [
    "given_name",
    "surname",
  ],
  "results": [
    [
      "Joe",
      "Schmoe"
    ],
    [
      "Jane",
      "Doe"
    ]
  ]
}

但是当我开始编写JavaScript来处理返回的数据时,我想知道用键/值对输出结果是否更好,例如:

{
  "results": [
    {
      "given_name": "Joe",
      "surname": "Schmoe"
    },
    {
      "given_name": "Jane",
      "surname" : "Doe"
    }
  ]
}

如果你返回了很多结果,那就是很多重复的文字。但是我们将要运输gzip,所以我不太关心带宽。

基本上,我应该设计这个,以便我用

访问我的数据
$.getJSON(query, function(data) {
  var columns = data.columns;
  var results = data.results;
  $.each(results, function(key, row) {
    console.log(row[columns.indexOf('surname')]);
  });
});

或者更漂亮的

$.getJSON(query, function(data) {
  var results = data.results;
  $.each(results, function(key, row) {
    console.log(row.surname);
  });
});

基本上,我想知道对性能的潜在影响是否证明了后一种选择的更清晰的语法。

跟进

我确实实现了它的方式和配置文件。 分析是一个好主意!性能差异很小。数据传输大小的差异很大,但是使用Gzip压缩时,非常大和非常小的数据集之间的格式之间的差异降至5-6%。所以我会选择更漂亮的实施方案。对于这个特定的应用程序,我可以期望所有客户端都支持Gzip / Deflate,因此大小无关紧要,客户端和服务器上的计算复杂性足够相似,无关紧要。

对于任何有兴趣的人,这里是my data with graphs!。

5 个答案:

答案 0 :(得分:7)

两者都有。之后进行优化。

答案 1 :(得分:7)

综合其他答案:

  1. 您的有线格式不必与内存格式相同。
  2. 更好的配置文件 - 看看它是否有所作为。
  3. 开始时通常情况下更简单。
  4. 此外:

    • 如果你只有一个结果页面,而且用户很少,那么第二种格式可能并不比第一种格式差。
    • 如果您的数据非常稀疏,则第二种格式可能更好。
    • 如果您要发送1000或数据行,并且您有数百万用户,那么您发送的数据大小可能会开始变得重要,也许第一种格式可能帮助
    • 您不能保证所有用户代理都支持gzip / deflate,请记住这一点。

答案 2 :(得分:2)

您不必将代码绑定到更紧凑,但也更麻烦的格式。只需编写一个简单的JS适配器来检查返回的结构是否存在columns。如果缺少那么你正在处理一个简单的对象数组。如果它存在,您可以轻松地将繁琐的格式映射到更方便的格式。

答案 3 :(得分:1)

FWIW我会选择第二个选项,它可以让你看到更清晰的JavaScript,并且人们也可以更容易阅读和理解。在我看来,可读性胜过从选项1获得的任何小的性能提升。

我还想象如果你要添加更多列或者某天更改列的顺序,使用第一个选项,你可能需要重写很多JavaScript,因为你将使用这个位置响应中的数据。

答案 4 :(得分:1)

只是另一个JSON结构,我得到了非常好的结果:

{
    "recordCount": 2,
    "data": {
        "Id": [1, 2],
        "Title": ["First record", "Second record"]
        "Value": [18192, 18176]
    }
}

遍历所有数据:

for (var i = 0; i < recordSet.recordCount; ++i) {
    console.log("Record " + i.toString() + ":");
    for (var field in recordSet.data)
        console.log("\t" + field + ": " + recordSet.data[field][i].toString());
}