C++ - JSON for Modern C++ 이 버전 3.1로

원문

JSON for Modern C ++ 3.1 에서는 Universal Binary JSON(UBJSON) 기능 지원 및 JSON Merge Patch가 새롭게 추가 되었다.

UBJSON는 JSON for Modern C++에서 지원하는 여러 가지 형식의 하나로, 인코딩 크기 감소 및 디코딩 속도를 목적으로 한다.
UBJSON 외에는 CBOR 이나 MessagePack을 지원하고 있다.
각각 독자의 장점을 가지고 있기 때문에 어느 것이 올바른 선택인지는 표현하는 데이터의 종류에 따라 달라진다.
3개 중 UBJSON만 완전한 바이너리 포맷이다. 즉, 모든 JSON 값을 UBJSON으로, 모든 UBJSON 값을 JSON으로 변환이 가능하다.

JSON Merge Patch는 2개의 JSON 문서 사이의 차이를 선언적으로 기술하는 것을 목적으로 한 포맷이다.
HTTP PATCH 동사와 함께 사용하기 위한 것이지만, HTTP PUT가이 리소스 전체를 대체 하는 것에 대해 부분적인 업데이트를 가능하게 한다.
JSON Merge Patch를 사용하면 JSON의 일부를 정의하고 이를 서버 측에서 병합 할 수있다.
원 JSON 문서에 대한 일련의 패치 작업 사양에 의존하는 기본적인 JSON Patch 포맷보다 이쪽이 편리하다. 예를 들어,

// a JSON value
json j_document = R"({
  "a": "b",
  "c": {
    "d": "e",
    "f": "g"
  }
})"_json;

// a JSON patch (RFC 6902)
json j_patch_1 = R"([
  { "op": "replace", "path": "/a", "value": "z" },
  { "op": "remove", "path": "/f"}
])"_json;


// a JSON Merge patch (RFC 7386)
json j_patch_2 = R"({
  "a":"z",
  "c": {
    "f": null
  }
})"_json;

JSON for Modern C ++ 라이브러리는 JSON 데이터를 마치 일반적인 데이터 형식처럼 취급 할 수있는 직관적인 구문을 제공하기 위한 것이다.
예를 들어 다음과 같이 기술하는 것으로 개체를 인스턴스화 할 수있다.

json j2 = {
  {"pi", 3.141},
  {"happy", true},
  {"name", "Niels"},
  {"nothing", nullptr},
  {"answer", {
    {"everything", 42}
  }},
  {"list", {1, 0, 2}},
  {"object", {
    {"currency", "USD"},
    {"value", 42.99}
  }}
};

마찬가지로 문자열 리터럴 __json을 덧붙이면 JSON 문자열의 디코딩이 가능하다.

auto j2 = R"(
  {
    "happy": true,
    "pi": 3.141
  }
)"_json;

다른 장점은 전체가 하나의 헤더 파일 json.hpp에 담겨 있으며, 외부 라이브러리 및 종속성을 전혀 필요로 하지 않는 데 따른 높은 통합성을 제공한다.
또한 유닛 테스트를 통해 100%의 코드 커버리지를 실현함과 동시에 메모리 누수도 없다라는 것읻다.


이 글은 2018-08-30에 작성되었습니다.