1

我有一个 json 数据并试图用 d3.json 函数解析它。数据的格式是这样的。

{
"StoreVisitGraphCount": {
    "list": {
        "count": 23,
        "date": "01-2013"
    },
    "parameters": {
        "format": "m-Y",
        "point": 10,
        "type": "mo"
    }
   }
}

我正在尝试使用以下函数解析它

d3.json("http://localhost:8080/data-  services/rest/storeVisitsGraph/20120101,20131231,-1", function(error, data) {
data.StoreVisitGraphCount.list.forEach(function(d) {
d.date = parseDate(d.date);
d.count = +d.count;
});

它显示一个错误说“Uncaught TypeError: Object # has no method 'forEach'”但是在将 json 数据修改为

 {
"StoreVisitGraphCount": {
    "list": [{
        "count": 23,
        "date": "01-2013"
    }],
    "parameters": {
        "format": "m-Y",
        "point": 10,
        "type": "mo"
    }
   }
}

使列表成为一个数组..它成功解析显示没有错误..因为当列表数组中只有一个数据时,其余的会像第一种格式一样创建 json,但是当有多个列表数据时,它会像第二种格式一样创建 json ...如何在 d3.js 中解决或编写函数,以便它也可以解析第一种格式...

4

2 回答 2

1

如果您想同时处理这两种数据格式,最直接的方法是检查data.StoreVisitGraphCount.list是 anArray还是Object. 从问题中解决:如何检查 JSON 响应元素是否为数组?,最可靠的方法是:

function isArray(what) {
    return Object.prototype.toString.call(what) === '[object Array]';
}

然后您的代码将显示为:

d3.json(..., function(error, data) {
  if (!isArray(data.StoreVisitGraphCount.list)) {
    data.StoreVisitGraphCount.list = [ data.StoreVisitGraphCount.list ];
  }

  data.StoreVisitGraphCount.list.forEach(function(d) {
    d.date = parseDate(d.date);
    d.count = +d.count;
  });
});

然而,这并不是一个非常一致的 API 设计。如果 API 在您的控制范围内(您从 运行服务localhost),则考虑将其更改为一致并在每种情况下返回一个列表。

于 2013-02-05T13:24:06.487 回答
0

第一种格式实际上并不包含一个列表,而是一个对象散列。您需要按如下方式修改代码才能使用它。

d3.json(..., function(error, data) {
  data.StoreVisitGraphCount.list.date = parseDate(data.StoreVisitGraphCount.list.date);
  data.StoreVisitGraphCount.list.count = +data.StoreVisitGraphCount.list.count;
});
于 2013-02-05T09:40:45.663 回答