Theory/Data Exchange

JSON

JSON은 XML에 비해 상대적으로 가벼운 데이터 교환 형식이다.
C 언어의 영향을 받은 언어[각주:1]의 구조체/배열 형식과 유사하여 프로그래머에게 매우 친숙한 형태이다.
특히, 고대의 JavaScript의 일부에 토대로 두고 있어서 JavaScript와 그 구조가 매우 유사하다.[각주:2]


XML과 많이 비교되는데

공통점으로

  • 뛰어난 호환성을 제공한다. 많은 프로그램 언어와 웹, 소프트웨어에서 JSON을 지원한다.
  • 텍스트 파일로서 사람이 읽을 수 있다. 이는 디버깅에 매우 효과적이다.
  • 텍스트 파일임으로 이진 데이타보다 더 많은 용량을 차지한다.

다른점으로는

  • 상대적으로 가벼워서 구조가 간단한 데이타에 사용하기에는 적합하다.
  • 반면, DTDXML 스키마와 같이 언어를 정의하고 확장, 검사하는 도구가 부족하다.
  • 메타데이터와 네임스페이스를 제공하지 않는다.


JSON은 오브젝트(object)를 기본 요소로 한다.
오브젝트는 '{'로 시작하여 '}'로 끝난다.
오브젝트는 이름/값의 쌍을 포함한다.
이름/값은 사이에는 ':'이 들어간다.

{"foo":1}

오브젝트 내에 이름/값의 쌍은 ',' 구분한다.
마지막 이름/값 쌍에는 ','를 붙이지 않는다.

{"foo":1, "bar":"baz", "qux":true}


여러개의 값을 나열할 때는, 배열(array)를 사용한다.
배열은 '['로 시작하여 ']'로 끝난다.
값은 ','로 구분한다.

["foo", 1, "bar", "baz"]


이름(name)은 반드시 문자열(string)이어야 한다.
문자열은 큰따옴표(")로 감싼다.

큰따옴표 없이 사용하거나,

{foo:1}

작은따옴표(')로 감싸는 것 모두 올바른 표기가 아니다.

{'foo':1}


값에는 문자열, 숫자, true, false, null, 객체, 배열이 올 수 있다.


json.org의 예제를 첨부한다.

{
  "glossary": {
    "title": "example glossary",
    "GlossDiv": {
      "title": "S",
      "GlossList": {
        "GlossEntry": {
          "ID": "SGML",
          "SortAs": "SGML",
          "GlossTerm": "Standard Generalized Markup Language",
          "Acronym": "SGML",
          "Abbrev": "ISO 8879:1986",
          "GlossDef": {
            "para": "A meta-markup language. ...",
            "GlossSeeAlso": ["GML", "XML"]
          },
          "GlossSee": "markup"
        }
      }
    }
  }
}

두번째 줄 이름 "glossary"의 값은 객체이다.
세번째 줄 이름 "title"의 값은 문자열이다.
열다섯번째 줄 이름 "GlossSeeAlso"의 값은 배열이다.


2012/12/21 - [Theory/Data Exchange] - XML

  1. C++, Java, JavaScript, Perl, Python 등 [본문으로]
  2. JavaScript의 부분 집합으로 많이 알고 있는데, 일부 형식만 차용한 언어 중립적인 형식이다. [본문으로]
저작자 표시 변경 금지
신고

'Theory > Data Exchange' 카테고리의 다른 글

JSON  (0) 2017.02.01
XML 스키마  (0) 2012.12.28
DTD  (0) 2012.12.27
XML  (0) 2012.12.21
Life/Society

I am not scared. I just wish I had more time...

I am not scared. I just wish I had more time. To show mommy and daddy how much I love them.

- "Who is the most interesting person you've ever sat next to on an airplane?" 질문의 최고의 답변 중에서...

저작자 표시 변경 금지
신고
Practice/Emacs

CentOS 7 emacs-25.1 64bits RPM

GUI 환경에서 GNU Emacs


터미널 환경에서 GNU Emacs


2015/06/01 - [Practice/Emacs] - CentOS 5 emacs-24.5 64bits RPM

2015/05/28 - [Practice/Emacs] - CentOS 6 emacs-24.5 64bits RPM

  1. <pre class="brush: plain">cat emacs-common-25.1-3.el7.centos.x86_64.rpm-a* &gt; emacs-common-25.1-3.el7.centos.x86_64.rpm</pre> [본문으로]
저작자 표시 변경 금지
신고
Practice/C & C++

C언어에서 struct 정의 그대로 이진 데이터로 만들기

C의 struct를 이진 데이터로 저장하고 불러오는데 원하는대로 되지 않을 때가 있다.
예를 들어, 2 바이트 이후에 적혀야 하는데 4바이트 뒤에 위치하는 경우이다.


예상한 이진 데이터의 구조:


실제 이진 데이터의 구조 (목표 머신-target machine-을 64 bits로 컴파일한 경우):


이는 데이터 구조체 정렬(data structure alignment) 때문에 발생한다.
데이타 구조체 정렬이란 해당 머신의 읽고 쓰는 단위 크기의 배수로 데이타를 할당하는 것을 말한다.
데이터가 이 배수값보다 작으면 데이터 구조체 패딩(data structure padding)을 해준다.


현대의 컴퓨터는 성능을 높이기 위해서 이런 방식을 기본으로 사용한다.
따라서, 프로그래머가 정확한 이진 데이터를 생성하려면 이 기능을 꺼야 한다.


GCC에서는 __attribute__((packed)) 키워드를 사용하여 가장 작은 데이타를 만든다.
즉, padding이 들어가지 않도록 한다.

typedef struct __attribute__((__packed__)) seg_info_s {
    uint64_t stt;
    uint32_t seq;
    uint64_t dur;
    uint8_t  flags;
    uint64_t offset;
    uint32_t size;
    uint8_t  key_id[16];
    char     path[PATH_MAX+1];
} seg_info_t;


Visual C에서는 #pragma pack(1) 지시어를 사용하여 1 바이트 경계에 정렬하도록 명시한다.

#pragma pack(1)

typedef struct seg_info_s {
    uint64_t stt;
    uint32_t seq;
    uint64_t dur;
    uint8_t  flags;
    uint64_t offset;
    uint32_t size;
    uint8_t  key_id[16];
    char     path[PATH_MAX+1];
} seg_info_t;


저작자 표시 변경 금지
신고
Practice/Debugging

교착상태(deadlock)를 프로세스 상태와 디버거를 사용해서 찾아내기

멀티미디어(multimedia) 소스를 입력을 받아서 가공하여 출력하는 프로그램을 개발하고 있었다.
얼마간 동작하다가 아무것도 출력하지 못하는 문제를 일으켰다.
로그를 살펴보니 입력 모듈이 돌아가는 쓰레드(thread)에서 데이타를 읽지 않고 있었다.


무한 루프에 빠져서 기능이 중단되었을 수 있다.
이는 프로세스가 CPU를 과도하게 점유하는지를 살펴보면 알 수 있다.
top 유틸리티로 확인해보니 오히려 CPU 점유율이 정상보다 더 낮았다.


다음으로 교착상태(deadlock)를 의심할 수 있다.
프로세스 상태를 보면 더 의심이 간다.


문제의 상태에 진입한 프로세스를 gdb에 붙여서 상태를 확인했다.

$ gdb -p <PID>

쓰레드 목록을 얻고, 각 쓰레드의 콜스택(call stack)을 살펴봤다.

- 쓰레드 목록 얻기 :

(gdb) info thread

- 쓰레드 이동 하기 :

(gdb) thread <THREAD-ID>

- 콜스택 보기 :

(gdb) bt


문제의 모듈이 속한 쓰레드를 발견하였다.
예상대로 잠그려고 대기중인 상태를 보여주었다.
더불어, 잠금을 획득하고 멈춰있는 다른 쓰레드-이후 잠금 요청을 대기하게 만든 쓰레드-까지 발견했다.


잠금을 획득하고 멈춰있는 쓰레드의 콜스택과 코드를 자세히 분석했다.
잠금을 걸고 네트워크를 통해서 요청을 보낸 후에 응답을 받는 부분에서 멈추었다.


멈춘 싯점에서 로그를 역순을 분석하였다.
문제와 연관된 네트워크 세션의 로그와 관련 코드를 중점적으로 살펴봤다.
네트워크 세션을 잠금을 사용하지 않고 접근하여 오염시키는 코드를 찾았다.
이 코드를 수정하여 문제를 해결하였다.

저작자 표시 변경 금지
신고
  1. M/D Reply

    비밀댓글입니다

 [ 1 ]  [ 2 ]  [ 3 ]  [ 4 ]  [ 5 ]  [ 6 ]  [ ··· ]  [ 36 ] 

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

카운터

Today : 20
Yesterday : 111
Total : 171,005