通过 JSON/Web 服务公开此数据的最佳方式是什么?

What's the best way to expose this data via JSON/Web Service?

我正在创建一种预订系统,并希望以类似于此的格式向用户显示数据:

                          Hours
           ID  0   1   2   3   4   5   6   7   8   9   .   .
------------------------------------------------------------
03/09/2015 ID1 ----++++++++++++++++++++++++++++++++++-------
           ID2 -----------++++++++++++----------------------
           ID3 ----+++++++++++-----------------+++++++++++++
03/09/2015 ID1 ----++++++++++++++++++++++++++++++++++-------
           ID2 -----------++++++++++++----------------------
           ID3 ----+++++++++++-----------------+++++++++++++

我还控制公开此数据的 Web 服务,因此我正在尝试考虑执行此操作的最佳方法(我将使用 D3.js 使用此 Web 服务)

我可以用一个非常原始的方式用情节点列表公开数据:

var data = [
     ["01/01/2015 00:00:00", "ID1", 0],
     ["01/01/2015 00:00:15", "ID1", 0],
    ...
];

好像有点浪费,因为有很多重复的数据要传输。另一种选择是在服务器端打包数据并将其作为 "map of map of arrays" 提供:

var data = [
    {date: "01/01/2015", value: [
        {id: "ID1", value: [0,0,0,0,1,1,1,1,1...]},
        {id: "ID2", value: [0,0,0,0,0,0,0,0,0...]},
        {id: "ID3", value: [0,0,0,0,1,1,1,1,1...]}
    },
    {date: "01/02/2015", ...
];

所以你有一个映射,键为 "date at midnight",映射的值为键,键为 "id",数组的值为包含 96 个布尔值(每 15 分钟 1 个)增量)。但是,此选项似乎与数据紧密耦合 table。

这个 table 在现在和可预见的未来是这个 Web 服务的唯一消费者,所以它的耦合可能不会那么糟糕。另一方面,对 table 的任何更改都可能迫使我们更改 table 视图和 Web 服务。

首先,我认为不值得努力减少看起来有点浪费,因为 gzip 编码会消除大部分冗余,您应该关注维护成本.您的第二个提案作为协议非常具体且不灵活。如果将精度更改为 10 分钟会怎样?这将花费你一些重写。所以我认为应该在协议中保留一些灵活性。

另一个要点是ISO8601 Time intervals。这样您就可以在时间范围内发送保留间隔,例如每周:

var data = {
  'ID1' : [
    '2015-01-01T01:00:00Z/2015-01-01T09:15:00Z',
    '2015-01-02T01:00:00Z/2015-02-01T09:15:00Z'
  ],
  'ID2' : [
    '2015-01-01T02:45:00Z/2015-01-01T05:30:00Z',
    '2015-01-02T02:45:00Z/2015-02-01T05:30:00Z'
  ],
  ...
};

不过,我还是没看出你的第一个提案有什么不好,因为简单很重要。