ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C언어] JSON 파일 파싱 라이브러리 jansson
    기타 프로그래밍 2022. 5. 14. 23:25

    (2022.07.12) 내용 수정


    C언어로 JSON 파일을 파싱하게 될 날이 올 줄은 상상도 하지 못했다.

    그러나 필요하면 해야지 어쩌겠는가

     

    C언어로 json 파일 파싱을 도와주는 라이브러리는 jansson, json-c 등등 여러 가지가 있지만 jansson을 택했다.

    그 이유는 선배님들이 사용하신 라이브러리가 jansson이라 코딩할 때 선배님들 코드를 참고할 수 있기 때문이다.

    아주 간단하게 사전조사를 해본 결과 jansson이 예전부터 사용된 라이브러리라 안정적이고, json-c와 크게 성능 차이가 나지 않는다는 글을 봤어서 무엇을 사용하든 상관 없겠다 생각했는데...

    https://jhhwang4195.tistory.com/94, https://github.com/miloyip/nativejson-benchmark 를 확인해보니 2016/09/09 기준 조금은 성능차가 있긴 있나 싶다.
    다만 현재 6년 전 자료고 라이브러리는 계속 업데이트 되는 상황이라 정확한 것은 모르겠다. (2022년 기준)

    하지만 당장 큰 문제는 되지 않을 것 같고, 일단 참고할 수 있는 코드가 존재한다는 것은 중요한 일이다.

    신규 프로젝트 지원 건이라 새 파일을 생성해서 처음부터 코딩을 해야 하는데... 내 코드 품질에 자신이 없으므로 뭐라도 참고할 수 있는 코드가 필요하다.

    물론 깔끔하게 짤 수 있지만, 그건 내 기준이고 선배님들이 보기엔 아닐 확률이 높으니...

    아무튼 나중에 수정이 필요한 경우가 생기면 라이브러리를 바꾸는게 맞을 것 같다.

     

    https://jansson.readthedocs.io/en/latest/

     

    Jansson Documentation — Jansson 2.14 documentation

    © Copyright 2009-2020, Petri Lehtinen Revision 128e9c5f.

    jansson.readthedocs.io

    2022/05/03에 업데이트 된 최신 버전 jansson 2.14을 사용했다.

     

    API reference를 보면 예시가 조금 부족한 느낌이 들지만 충분히 사용할 수 있을 정도로 설명이 되어 있다.

    json_incref 함수와 json_decref 함수는 아직 사용법을 잘 모르겠다.

    일단 선배님들의 코드를 참고해서 json 파일을 열 때 json_load_file 함수를 사용하고,
    해당 함수로 반환받은 json_t* 타입 변수의 사용이 끝났을 때 json_decref 함수를 사용하는데
    이렇게 사용하는 것이 맞는 건지는 잘 모르겠다.

     

    리눅스에서 jansson을 다운 받은 방법은 다음과 같다.

    https://github.com/akheron/jansson/releases

    해당 링크에서 최신 버전의 tar.gz 파일을 다운 받고 tar로 압축을 해제했다.

    tar -zxvf <tar.gz 폴더명>
    
    #압축 풀은 해당 폴더에서
    ./configure
    make
    make install

    configure와 make 과정을 끝내면 설치가 완료된다. 나 같은 경우엔 make 후에 checkinstall -y로 설치를 완료했다.

    컴파일 할 때 -ljansson 옵션을 줘서 해당 라이브러리를 사용할 수 있다. (링크 및 컴파일에 대한 자세한 설명은 생략한다)

     

    만약 소스 코드를 컴파일한 후에 파일을 실행할 때 "cannot open shared object file: No such file or directory" 오류가 발생한다면

    ln -s /usr/local/lib/libjansson.so.4 /usr/lib/libjansson.so.4

    내 경우엔 symbolic link를 만드니 해결됐다.

    댓글

Designed by Tistory.