2014-06-09 3 views
2

콘서트 데이터의 ATOM 피드를 소비하고이를 조금 더 소비하기 위해 JSON으로 출력하려고합니다.nodej를 사용하여 읽을 수있는 스트림을 유효한 JSON으로 변환하려면 어떻게해야합니까?

지금까지 나는 request을 사용하여 데이터를 얻었으며 feedparser을 분석하고이를 통해 원하는대로 작동하는 것으로 보입니다.

// data 
var feed = 'http://mix.chimpfeedr.com/630a0-dcshows'; 
var wstream = fs.createWriteStream('data.json'); 

var req = request(feed); 
var feedparser = new FeedParser({ 
     addmeta: false 
    }); 

req.on('response', function(res) { 
    var stream = this; 
    if (res.statusCode != 200) return this.emit('error', new Error('Bad status code')); 
    stream.pipe(feedparser) 
}); 

feedparser.on('readable', function() { 
    var stream = this; 
    var item; 

    // ... do some business work to get a `data` object 

    wstream.write(JSON.stringify(data) + ','); 
}); 

이 이러한 데이터 객체의 연결된 목록은 말 그대로 파일을 작성 :

{ 
    object1 
}, { 
    object2 
}, { 
    etc 
}, 

이 멋지다하지만이 배열로 포장하고 싶습니다 내가 마지막 싶습니다 항목 뒤에 쉼표가 없습니다. 이 문제를 해킹 할 수있는 방법이있을 것이라고 확신하지만 스트림 접근 방식의 핵심 개념과 실제 상황을 놓치고 있다고 생각합니다.

제 질문은 : 어떻게 읽을 수있는 스트림 (XML)을 조작하고 올바른 JSON 배열을 출력합니까?

답변

3

아마 당신의 접근 방식에 문제는 스트림에 넣은 모든 JSON 요소의 끝에 쉼표를 추가한다는 것입니다. 이 방법은 읽기 스트림에서 더 많은 데이터가 나오는지 확신 할 수 없기 때문에 실패합니다.

JSON 요소의 시작 부분에 쉼표를 추가하는 것이 더 나은 방법이지만 이전에 하나 이상의 요소를 이미 처리 한 경우에만 사용할 수 있습니다. 이 문제에 대해 플래그 또는 변수를 처리하여 처리 한 요소의 수를 계산할 수 있습니다.이 요소를 기반으로 첫 번째 요소를 처리할지 여부를 결정할 수 있습니다.

첫 번째 요소에있는 경우 "["을 스트림에 추가하여 배열의 시작 부분을 나타내고 첫 번째 요소를 쓰기 스트림에 추가합니다. 첫 번째 요소를 처리하지 않으면 두 번째, 세 번째 또는 n 요소에 있음을 의미합니다.이 경우 쉼표를 추가하고 요소를 추가합니다.

마지막으로 'end' 이벤트에 대한 수신기를 읽기 스트림에 추가하면 데이터 끝에 도달했을 때 알림을 받고 쓰기 스트림 의 닫는 괄호를 추가하고 완료 할 수 있습니다 유효한 json 배열.

내 하드 디스크의 일부 로컬 데이터를 사용하여이 예제의 단순화 버전을 만들었습니다. 나는 당신이 당신의 경우에 그것을 적용 할 수 있다고 확신합니다.

var FeedParser = require('feedparser'), 
    fs = require('fs'), 
    feed = __dirname+'/rss2sample.xml'; 

var ws = fs.createWriteStream('data.json'); 
var first = true; 
fs.createReadStream(feed) 
    .on('error', function (error) { 
    console.error(error); 
    }) 
    .pipe(new FeedParser()) 
    .on('error', function (error) { 
    console.error(error); 
    }) 
    .on('readable', function() { 
    var stream = this, item; 
    while (item = stream.read()) { 
     if(first){ 
     ws.write('['); 
     first = false; 
     } else { 
     ws.write(','); 
     } 
     ws.write(JSON.stringify(item)); 
    } 
    }) 
    .on('end', function(){ 
    ws.write(']'); 
    }); 

유효한 json 파일을 생성합니다.

관련 문제