조사 대상

라이브러리명언어기타
jsoncpp (강추)C++큰 무리 없이 사용 가능
janssonC

오래되고 안정적임.

단 C 언어라 코딩하기 귀찮음.

단, C언어로 개발해야 한다면 jansson을 쓰는 것이 제일 좋음.

json spiritC++Boost Spirit library 사용. header only로 설치가 된다던데, 설치 포기.
MongoDB의 json parserC++

mongodb C++ driver에 내장됨. Mongo::fromjson()

mongodb C++ driver에 있으므로 따로 설치할 필요가 없으나, 사용하기는 좀 어려웠음.

UniversalContainerC++원래 목적은 PHP 등 스크립트 언어의 자료 구조를 지원하는 용도이나, json으로 encode, decode 가능.
설치 후 하는데 고생을 좀 했는데, 테스트 시 seg. fault가 나서 테스트 포기


각 라이브러리별 특징을 조사하면 다음과 같습니다.


jsoncpp

  • http://jsoncpp.sourceforge.net/
  • 큰 단점없이 사용 가능.
  • 단, library 빌드 시 -O2 가 안 켜져 있어서 직접 켜줘야 속도가 빠름. 안 그러면 PHP보다 느림.
    • library 소스에서 SConstruct 파일을 열어서 CCFLAGS = "-Wall"에 -O2를 추가하거나 scons로 --opt=-O2 주기.
  • key 순서가 알파벳 순서로 바뀌어 출력됨.
    {
        "k2":"xxx",
        "k1":"yyy"
      }

    의 문서 경우, json 문서를 탐색할 때 항상 k1이 먼저 접근됨.

  • key 순서 문제의 경우, http://sourceforge.net/tracker/?func=de ··· 3D144446 를 참고하여 소스를 직접 바꾸면 된다고 하는데 아직 실험적인 방식이라 시도해 보진 못함.
  • UTF-8 문서를 읽는데 문제는 없으나, 출력 시 utf8 문자를 \uxxxx 형태로 출력하는 것은 안 됨. (읽을 때는 가능)


jansson

  • http://www.digip.org/jansson/
  • 만든지 오래되고 사용하는 곳도 많은 듯.
  • 단, C 언어라서 코딩하기가 귀찮음.
  • C언어로 개발할 때는 jansson을 사용하는게 제일 좋을 듯.
  • utf8 fully support
  • json object간에 reference count를 수동으로 기록할 수 있고, 메모리 관리를 개발자가 직접할 수 있음.
  • 그러나 이를 관리하기 위한 코딩이 좀 수고스러울 듯.

json spirit

MongoDB의 JSON Parser

  • http://api.mongodb.org/cplusplus/2.0.2/ ··· 436026c2
  • mongodb C++ driver를 다운 받으면, Mongo::fromjson() method.
  • mongodb로 프로젝트를 하는 경우, BSONObj를 다룰 줄 알아야 하므로 json parser로 적당할 수도.
  • 단, 64MB 이상의 경우 parsing 하다가 에러 발생.
    • mongo/bson/util/builder.h 파일을 열어서 BSONObjMaxUserSize, BufferMaxSize의 값을 늘리면 해결 가능함.
  • json 파싱 시간은 느리지만, 메모리 사용량은 다른 것보다 적음. (Bson 형태이므로 압축 효과가 있어서 그럴 듯??)
  • JSON 문서가 항상 object로 시작하고 key가 있어야 함. 이건 좀 불편함.
    [{...}] <= object로 시작하지 않아서 안 됨.
      {"temp":[{...}]} 로 변환해야 함.
  • key에 _id가 항상 삽입됨....

UniversalContainer

  • http://greatpanic.com/progdocs/libuc.html
  • 원래 목적은 자료 구조를 PHP, Perl 처럼 쉽게 접근하기 위한 목적임.
  • 자료 구조를 JSON으로 serialize, de-serialize 가능함.
  • FlexLexer.h 파일 문제 때문에 컴파일이 안 되는데 인터넷 찾으면 설치는 가능함.
  • 어렵사리 설치를 했으나, 테스트 해 보면 seg. fault가 많이 발생.
  • 더 이상 테스트 포기
  • 복잡한 자료구조를 담고 사용하는데 편리해 보였는데 테스트 조차 못해서 아쉬움이 큼.
  • 그런데 jsoncpp로 복잡한 자료 구조를 담고 사용하는데 편해서 다행임.

성능 테스트

평가 결과는 각자 환경마다 다를 수 있으니 너무 맹신하진 마세요.

평가 대상

총 5개의 Library 중, 테스트 가능한 다음의 2개 + PHP가 테스트 대상임.

  • jsoncpp
  • janson
  • Mongo::fromjson
  • PHP

평가 환경

  • 입력 파일
    • 파일 사이즈 : 250MB
    • 2차원 array 형.
      [
        {....} <= depth 확장 없음. 총 190만개의 element가 있음.
        ...
        ...
        {....}
      ]
  • 평가 항목
    • parsing 시간
    • parsing 시 메모리 사용량
    • 탐색 시간 (각 element의 특정 key를 출력)

성능 평가 결과

구분jsoncppjanssonPHPMongo::fromjson
parsing 시간10초13초10초24초
메모리 사용량1.4GB1.3GB2.5GB800MB
탐색 시간13.7초13.8초13.4초N/A

결과에 대한 소고



이올린에 북마크하기
Writer profile
DDURI
Posted by dduri.
TAGS , ,

Leave your greetings here.

[로그인][오픈아이디란?]


JSON은 인터넷을 통해 응용프로그램간 데이터를 주고 받는 규칙 즉 데이터 포맷을 일컫는다

데이터 포맷을 위한 표기법이 자바스크립트 객체 표기
방식에 근거를 두어
전체 이름이 JavaScript Object Notation 며 그 약자가 JSON 이다

JSON 은 Douglas Crockford 라는 미국의 개발자에 의해 탄생했으며 JSON 을 가장 잘 설명해 놓은 곳은 역시 JSON 공식 웹 사이트이다. 다음의 JSON 사이트에서 JSON의 모든 것을 알 수 있다
=> http://www.json.org/ (한글판: http://json.org/json-ko.html)

그리고 위키백과에도 JSON 을 꽤 적절하게 잘 설명하고 있다
=> http://ko.wikipedia.org/wiki/JSON

인터넷을 통한 원격 통신간 데이터 교환 포맷인, JSON 은 요즘 뜨는 최신 기술이 아니다.
이미 수 년전부터 곳곳에서 이를 이용해 왔으며 나의 경우 3년전인 2007년경에 처음 접하게 되었다
웹의 비동기 통신기법인 Ajax 의 등장시기와 유사한 2005년경에 본격적으로 이름이 알려지기 시작한 것 같으며 현재 트위터와, 오픈 API 와 같은 경량성, 상호연동성, 쉽고 편리한 API를 중시하는 서비스들에 많이 적용되고 있는 추세이다

그리고 JSON 이 비록 자바스크립트 구문형식을 따르기는 하지만 그 자체로 하나의 독립적인 체계로써 특정
언어나 플랫폼에 종속되지 않으며 C#, Java, ASP, PHP, C, C++ 등의 다양한 언어에서 JSON 포맷을 위한 파서들이 제공되고 있다.


인터넷 데이터 교환 포맷
인터넷 특히 웹을 통한 데이터 교환은 JSON 이전에도 존재했었다.
가장 원시적인 방법이 일반 텍스트를 이용하는 것이었다. 단일 값은 물론 복수의 값도 전달가능 일반 텍스트로 전달하곤 했었는데, 대체로 다음과 같이 구분자를 기준으로 텍스트 포맷을 주고 받는 형태였다

일반 텍스트 포맷: "name=박종명 || email=mkex@naver.com || age=36"
전체 구분자로 '||'를 이용하고 키,값 구분자로 '=' 를 이용하여 데이터를 정의했으며 수신하는 측에서는 구분자를 기준으로 문자열을 분리하여 그 의미를 해석하곤 했다

척박한 당시 상황에서는 일반텍스트 포맷은 꽤 많은 곳에서 이용되었으며 대략 만족하기도 했었다
그러나 구분자 역시 문자이기 때문에 전달하고자 하는 데이터 자체와 충돌할 수 있었고 배열 형태와 같은
복수 집합 자료를 정의하기에는 어울리지 않는 포맷이었다

---

다음으로 각광 받은 포맷이 XML 이다. XML 자체가 데이터 정의에 매우 적합한 언어이기에 아주 훌륭한 포맷이었다. 다음에서 보는바와 같이 각 요소는 정확한 의미의 태그와 연결될 수 있으며 집합자료정의도 쉽게 할 수 있다. 또한 요소의 attribute 를 이용하면 데이터 타입이나 제약사항과 같은 같은 추가 정보도 얼마던지 정의할 수 있어 데이터 정의에 매우 적합한 형태이다
<user>
  <name>박종명</name><email>mkex@naver.com</email>
  <name>홍길동</name><email>xxxxxxx@naver.com</email>
  ...
</user>

이와같이 XML은 데이터에 의미를 부여하기 위해서는 그 어떤 포맷보다 훌륭하지만 매번 열고 닫아야 하는 태그 쌍은 데이터의 크기를 증가시키는 원인이 되기도 하며 XML을 파싱할 때 브라우저 호환성도 신경쓰이 부분이었다
--

이제 JSON의 등장이다. JSON 공식 사이트에서 JSON을 소개하는 문구를 가져와 본다
JSON (JavaScript Object Notation) is a lightweight data-interchange format. It is easy for humans to read and write

JSON은 텍스트 포맷보다 훨씬 효과적으로 데이터를 구조화 할 수 있다
JSON은 XML 포맷보다 가볍다. 그리고 가독성이 좋다
바꿔 말하면, JSON 은 텍스트만큼 가볍고 XML만큼 구조적이다
그리고 JSON 은 자바스크립트에 근간하기 때문에 웹 환경에 더욱 적합하다

Ajax, 웹 Open API 등 웹 환경에 JSON 이 대세인 이유가 조금은 설명되었을 것이다


JSON 사용하기
JSON 은 그 장점에 비해 사용법은 매우 심플하다
기본적으로 알아 둬야 할 것은 JSON은 (규칙이 있는) 텍스트 포맷이며 유니코드 인코딩이란 점이다

그리고 가장 기본적인 형태는 중괄호 안에 정의된 키:값 형태이다.
다수의 객체를 정의하기 위해서는[](대괄호)를 사용하며 배열요소는 ,(꼼마)로 구분한다.
JSON으로 숫자, 문자, 참/거짓, null, 객체, 배열등을 표현할 수 있다

다음의 코드는 id, age, blog 라는 속성을 가진 회원(user) 정보를 JSON 포맷으로 단일 객체와 객체 배열로
정의하고 자바스크립트로 핸들링 하는 예이다

var user = {"id":"mkex", "age":36, "blog":"http://m.mkexdev.net"}
alert(user.id); // mkex 출력

var objectArray = {
               users: [
                 {"id":"mkex", "age":36, "blog":"http://m.mkexdev.net"},
                 {"id":"mkex2", "age":36, "blog":"http://m.mkexdev.net"}
               ]                 
             }
alert(objectArray.users[1].id); //mkex2 출력



그리고 JSON이 자바스크립트 구문에 근간하기 때문에 다음과 같이 eval 을 통해 일반 문자열을 JSON 객체로 변환할 수 있다. 대부분 시나리오에서 JSON 객체를 문자열로 전송하고 수신측에서는 이를 JSON객체로 변환
하여 사용하게 된다

var userString = '{"id":"mkex", "age":36, "blog":"http://m.mkexdev.net"}'
var userJSON = eval("(" + userString + ")");
alert(userJSON.age); //36 출력
 
마이크로소프트 닷넷과 JSON
여러 언어들에서 JSON 포맷을 지원하기 위한 API들이 제공된다
닷넷을 사랑(?)하는 필자가 가장 먼저 언급할 것 역시 닷넷의 JSON 지원이다
닷넷 프레임워크에서는 System.Runtime.Serialization.Json.DataContractJsonSerializer 라는 클래스를 통해
닷넷 객체를 JSON 객체로 변환하거나 JSON 객체를 닷넷 객체로의 변환을 지원한다


다음의 블로그에서 자세한 정보를 얻을 수 있으니 참고 바란다
http://blog.naver.com/dotnethelper/60103536438

그리고 Json.NET 라이브러리도 있으니 참고 바란다

다양한 언어들을 위한 JSON 파서
JSON이 워낙 유명(?)하기에, 닷넷과 같이 프레임워크 차원에서 JSON 을 지원하는 경우도 있고 Json.NET과
같이 외부 라이브러리로 존재하기도 한다


http://www.json.org 에서는 각종 언어별로 제공되는 JSON 파서의 링크를 제공해 준다
상황에 맞는 라이브러리를 참고하기 바란다

참고로 자바스크립트의 eval 을 통한 변환은 예기치 않은 보안 문제가 발생할 수 있으므로
이들 파서의 사용은 더욱 권장된다

이올린에 북마크하기
Writer profile
DDURI
Posted by dduri.

Leave your greetings here.

[로그인][오픈아이디란?]
« Previous : 1 : 2 : 3 : 4 : 5 : ... 368 : Next »