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

Jus*_*rce 29 javascript jquery json

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

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

{
  "columns": [
    "given_name",
    "surname",
  ],
  "results": [
    [
      "Joe",
      "Schmoe"
    ],
    [
      "Jane",
      "Doe"
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

{
  "results": [
    {
      "given_name": "Joe",
      "surname": "Schmoe"
    },
    {
      "given_name": "Jane",
      "surname" : "Doe"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

基本上,我应该设计这个,以便我访问我的数据

$.getJSON(query, function(data) {
  var columns = data.columns;
  var results = data.results;
  $.each(results, function(key, row) {
    console.log(row[columns.indexOf('surname')]);
  });
});
Run Code Online (Sandbox Code Playgroud)

或者更漂亮

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

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

跟进

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

对于任何感兴趣的人,这是我的图表数据!

Ale*_*lds 8

两个档案.之后进行优化.


Rob*_*son 7

合成其他答案:

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

进一步:

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


Vin*_*ius 5

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

{
    "recordCount": 2,
    "data": {
        "Id": [1, 2],
        "Title": ["First record", "Second record"],
        "Value": [18192, 18176]
    }
}
Run Code Online (Sandbox Code Playgroud)

遍历所有数据:

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());
}
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,这称为“数组结构”(而原始数据是“结构数组”)。例如 https://perldoc.perl.org/perldsc.html (3认同)