2017/05/10

Recent entries from same category

  1. RapidJSON や simdjson よりも速いC言語から使えるJSONライブラリ「yyjson」
  2. コメントも扱える高機能な C++ 向け JSON パーサ「jsoncpp」
  3. C++ で flask ライクなウェブサーバ「clask」書いた。
  4. C++ 用 SQLite3 ORM 「sqlite_orm」が便利。
  5. zsh で PATH に相対パスを含んだ場合にコマンドが補完できないのは意図的かどうか。

おなじみC/C++から使えるJSONライブラリを紹介するコーナー。まずは過去のまとめ。

結構前からあった様だけど気付いて無かった。

GitHub - DaveGamble/cJSON: Ultralightweight JSON parser in ANSI C

README.md cJSON Ultralightweight JSON parser in ANSI C. Table of contents License Usage Welcome to c...

https://github.com/DaveGamble/cJSON

特徴は以下の通り。

  • 分かりやすい API
  • MIT ライセンス
  • スレッドセーフ
  • ANSI C (もしくは C89, C90) で書かれている

Not C++ で使える JSON パーサとしては分かりやすい API で良いと思います。参照カウンタを持っているのでメモリの解放もルートオブジェクトの破棄だけで行えます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"

int
main(int argc, char* argv[]) {
  cJSON *root = cJSON_CreateObject(), *arr, *item; 

  cJSON_AddNumberToObject(root, "count"1);
  cJSON_AddItemToObject(root, "items", arr = cJSON_CreateArray());
  cJSON_AddItemToArray(arr, cJSON_CreateString("こんにちわ世界"));
  cJSON_AddItemToArray(arr, cJSON_CreateFalse());
  cJSON_AddItemToArray(arr, cJSON_CreateNull());
  puts(cJSON_PrintUnformatted(root));
  cJSON_free(root);
  
  root = cJSON_Parse("{\"count\":1, \"items\":[\"こんにちわ世界\",false,null]}");
  arr = cJSON_GetObjectItem(root, "items");
  cJSON_ReplaceItemInArray(arr, 0, cJSON_CreateString("こんにちわ日本"));
  cJSON_ArrayForEach(item, arr) {
    puts(cJSON_Print(item));
  }
  cJSON_free(root);
  return 0;
}

欲を言うとシリアライズ時にメモリを確保しない API が欲しいです。

Posted at by