node.js 유용한 모듈 (13) – JSONStream

원문 링크 - http://www.catonmat.net/blog/nodejs-modules-jsonstream/

본 게시글은 원저자의 허락을 얻어 번역한 것입니다.

1회 연재 – dnode (RPC 라이브러리)
2회 연재 – optimist (옵션 파서)
3회 연재 – lazy (lazy 리스트 처리)
4회 연재 – request (HTTP 스트림 처리)
5회 연재 – hashish (해시 처리)
6회 연재 – read (쉬운 표준 입력 처리)
7회 연재 – ntwitter (트위터 API)
8회 연재 – socket.io (웹소켓 통신)
9회 연재 – redis (redis 클라이언트 라이브러리)
10회 연재 – express (경량의 고속 웹 프레임워크)
11회 연재 – semvar (버전 넘버링 처리)
12회 연재 – cradle (고수준 CouchDB 클라이언트)

이번에 소개할 모듈은 굉장히 훌륭한 JSONStream이라는 모듈이다. JSONStream은 Dominic Tarr에 의해 개발됐으며, 스트리밍 JSON을 파싱한다.

다음 예제와 같이 couchdb view가 있다고 하자.

{"total_rows":129,"offset":0,"rows":[
  { "id":"change1_0.6995461115147918"
  , "key":"change1_0.6995461115147918"
  , "value":{"rev":"1-e240bae28c7bb3667f02760f6398d508"}
  , "doc":{
      "_id":  "change1_0.6995461115147918"
    , "_rev": "1-e240bae28c7bb3667f02760f6398d508"
,"hello":1
} }, { "id":"change2_0.6995461115147918" , "key":"change2_0.6995461115147918" , "value":{"rev":"1-13677d36b98c0c075145bb8975105153"} , "doc":{ "_id":"change2_0.6995461115147918" , "_rev":"1-13677d36b98c0c075145bb8975105153" , "hello":2 } }, ... ]}

이제 여러분이 rows에서 doc값들만 빼내길 원한다고 하자. JSONStream을 통해 다음과 같이 쉽게 이러한 작업을 할 수 있다.

var parser = JSONStream.parse(['rows', /./, 'doc']);

이 예제는 rows.*.doc를 파싱할 stream을 생성한다.

parser가 stream이기 때문에, 여러분은 그것을 데이터로 만든 후 출력해야 한다. 다음과 방식으로 매우 깔끔하게 이러한 작업을 처리할 수 있다.

req.pipe(parser).pipe(process.stdout);

다음은 출력값이다:

{
  _id: 'change1_0.6995461115147918',
  _rev: '1-e240bae28c7bb3667f02760f6398d508',
  hello: 1
}
{
  _id: 'change2_0.6995461115147918',
  _rev: '1-13677d36b98c0c075145bb8975105153',
  hello: 2
}

위 코드에서 req는 couchdb view에 대한 요청이고 parser는 JSONStream 파서다. 그리고 process.stdout 으로 파싱된 스트림이 전달된다. 여러분도 확인할 수 있듯이 출력값은 오직 rows.*.doc 만이다. 이것은 전체 JSON을 메모리에서 읽을 필요없이 JSON stream을 파싱하는 굉장히 쉬운 방법이다.

JSONStream 은 다음과 같은 npm 명령으로 설치할 수 있다.

npm install JSONStream

JSONStream의 GitHub 사이트: https://github.com/dominictarr/JSONStream.

Enjoy!

If you love these articles, subscribe to my blog for more, follow me on Twitter to find about my adventures, and watch me produce code on GitHub!

iamhjoo(송형주) 에 관하여

인사이드 안드로이드 저자 / 최근엔 Node & JavaScript에 꽂혀서 허우적 거리고 있습니다.
이 글은 카테고리: node.js에 포함되어 있으며 태그: , , (이)가 사용되었습니다. 고유주소를 북마크하세요.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.

다음의 HTML 태그와 속성을 사용할 수 있습니다: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>