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

时间:2015-04-05 11:42:15

标签: json web-services d3.js

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

                          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],
    ...
];

似乎有点浪费,因为会传输大量重复数据。另一个选择是在服务器端打包数据并将其作为“数组映射图”提供,如下所示:

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", ...
];

所以你有一张地图,其中包含“午夜约会”和地图的值,其中包含“id”键和数组值,其中包含96个布尔值(每15分钟递增1个)。但是,此选项似乎与数据表紧密耦合。

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

1 个答案:

答案 0 :(得分:1)

首先,我认为值得努力减少似乎有点浪费,因为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'
  ],
  ...
};

但是,再次,我在第一个提案中没有看到任何不好的内容,因为简单性很重要。