通过 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'
],
...
};
不过,我还是没看出你的第一个提案有什么不好,因为简单很重要。
我正在创建一种预订系统,并希望以类似于此的格式向用户显示数据:
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'
],
...
};
不过,我还是没看出你的第一个提案有什么不好,因为简单很重要。