我有一个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;
});
显示错误说“未捕获的TypeError:对象#没有方法'forEach'” 但是在将json数据修改为
之后 {
"StoreVisitGraphCount": {
"list": [{
"count": 23,
"date": "01-2013"
}],
"parameters": {
"format": "m-Y",
"point": 10,
"type": "mo"
}
}
}
使列表成为一个数组..它解析成功显示没有错误.. 因为当列表数组中只有一个数据时,其余的创建json就像第一个格式,但是当有多个列表数据时 它创建了像第二种格式的json ...如何在d3.js中解决或编写函数,以便它也可以解析第一种格式......
答案 0 :(得分:1)
如果您想处理这两种数据格式,最直接的方法是检查data.StoreVisitGraphCount.list
是Array
还是Object
。从问题How to check if a JSON response element is an array?中解决,最可靠的方法是:
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
运行服务),那么请考虑将其更改为一致并在每种情况下返回列表。
答案 1 :(得分:0)
第一种格式实际上不包含列表,而是包含对象哈希。您需要按照以下方式修改代码才能使用它。
d3.json(..., function(error, data) {
data.StoreVisitGraphCount.list.date = parseDate(data.StoreVisitGraphCount.list.date);
data.StoreVisitGraphCount.list.count = +data.StoreVisitGraphCount.list.count;
});