2013-02-05 2 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; 
}); 

의 오류가 말을 보여주는 : "catch되지 않은 형식 오류 개체 #가있는 방법 '대해 forEach를'이 없습니다"이에 JSON 데이터를 수정 한 후 리스트를 배열하기

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

..이 성공적 나머지 목록 작성 어레이에서 하나 개의 데이터가 존재하는 경우와 같이 오류 .. 을 보여주는 파싱 첫 번째 형식처럼 json하지만 하나 이상의 목록 데이터가있는 경우 두 번째 형식과 같은 json을 만듭니다 ... d3.js에서 함수를 작성하거나 작성하여 첫 번째 형식도 구문 분석 할 수있는 방법을 사용합니다 ...

답변

1

, 그것을 할 수있는 가장 곧장 앞으로 방법은 data.StoreVisitGraphCount.listArray 또는 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에서 서비스를 실행하고 있음)를 통제하고 있다면 일관성있게 변경하고 모든 경우에 목록을 반환하십시오.

0

첫 번째 형식에는 실제로 목록이 포함되어 있지 않지만 개체 해시가 포함되어 있습니다. 코드를 수정하려면 다음과 같이 코드를 수정해야합니다. 당신은 데이터 형식을 모두 처리하려면

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