2013-02-05 107 views
1

我有一個json數據並試圖用d3.json函數解析它。數據的格式是這樣的。d3.js無法解析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; 
}); 

其顯示錯誤說「遺漏的類型錯誤:對象#有沒有一種方法‘的forEach’」 但JSON數據修改後

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

使得列表中的一個陣列..它成功地解析的表示作爲當在列表陣列只有一個數據的其餘部分不產生錯誤.. json類似於第一種格式,但是當有多個列表數據時 它創建了類似於第二種格式的json ...如何在d3.js中解析或編寫函數,以便它可以解析第一種格式...

回答

1

如果你想同時處理的數據格式,最直接的方式做到這一點是檢查data.StoreVisitGraphCount.list是否是ArrayObject。從這個問題以治癒: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的服務),那麼請考慮將其更改爲一致並在每種情況下返回一個列表。

0

第一種格式實際上並不包含一個列表,而是一個對象散列。您需要按照以下方式修改您的代碼以使用它。

d3.json(..., function(error, data) { 
    data.StoreVisitGraphCount.list.date = parseDate(data.StoreVisitGraphCount.list.date); 
    data.StoreVisitGraphCount.list.count = +data.StoreVisitGraphCount.list.count; 
});