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"
    }
   }
}

リストを配列にする..エラーなしで正常に解析されました..リスト配列にデータが1つしかない場合、残りは最初の形式のようにjsonを作成しますが、リストデータが複数ある場合は、2番目の形式のようにjsonを作成します... d3.js で関数を解決または記述して、最初の形式も解析できるようにする方法 ...

4

2 に答える 2

1

両方のデータ形式を処理する場合、最も簡単な方法は、 が であるか であるかを確認するdata.StoreVisitGraphCount.listことArrayです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 に答える