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

Javascript 我应该如何用JSON表示表格数据?,javascript,jquery,json,Javascript,Jquery,Json,我正在编写一个API,用于通过JSON从连接JDBC的Javaservlet检索数据。我之所以选择使用JSON,是因为我们希望在浏览器中对数据进行排序和其他操作,并且我们将跨域访问数据 因为我基本上是用JavaScript进行SQL查询,所以返回的数据本质上是表格。我开始写这篇文章,这样您就可以得到列标签列表,然后是值数组,例如: { "columns": [ "given_name", "surname", ], "results": [ [ "

我正在编写一个API,用于通过JSON从连接JDBC的Javaservlet检索数据。我之所以选择使用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,因此大小无关紧要,而且客户机和服务器上的计算复杂度都非常相似,所以这无关紧要


对任何感兴趣的人来说,这里是

FWIW我选择第二个选项,正如您所观察到的,它有助于更干净的JavaScript,并且也更容易让人阅读和理解。在我看来,可读性胜过从选项1中获得的任何一点性能提升


我还设想,如果有一天要添加更多的列或更改列的顺序,使用第一个选项,您可能需要重写大量JavaScript,因为您将处理响应中数据的位置。

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

同时配置这两种格式。随后进行优化。

综合其他答案:

  • wire格式不必与内存中的格式相同
  • 哪一个更好-看看它是否有区别
  • 简单一点通常是更好的开始
  • 进一步:

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

    这是另一个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());
    }
    
    for(变量i=0;i
    谢谢您的回答。一个小提示:您不能保证所有的用户代理都支持deflate,但出于实际目的,它们确实支持deflate。IE4确实会放气。:)当然,对于现代浏览器来说,大多数浏览器确实会接受gzip/deflate。然而,其他人可能会读到这篇文章,值得注意的是,并非所有的用户代理(不限于浏览器)都不支持它。请参阅参考资料,这被称为“数组结构”(而原始数据是“数组结构”)。例如在