以前にC言語でJsonファイルを利用する機会があり、その時のメモ書きです。
以下では、Jsonファイルをシリアル化と逆シリアル化する方法を確認します。
janssonとは
C言語で使用できるJSONファイル読み込み用ライブラリのことです。
はじめに
以下で紹介する内容はUbuntuでgccを使った場合の内容です。
まずはインストール方法です。
sudo apt-get install -y libjansson-dev
利用するときには、事前にインクルードします。
#include <jansson.h>
Jsonファイルサンプル
利用するJsonファイルのサンプルです。
ファイル名はconfig.jsonとします。
{
"fileInfo":
{
"file-name":"abcdefg.txt",
"No":1,
"ver":1.2
},
"array-section":
[
{
"No":1345
},
{
"No":7890
},
{
"No":9999
}
]
}
Jsonファイルにシリアライズ化する方法
Jsonファイルをシリアライズ化する方法です。(jsonファイルの作成)
サンプルファイルと同じ内容を用意していきます。
#include <jansson.h>
#include <string.h>
int main(int argc, char* argv[]) {
//ルート要素の作成
json_t* json_root = json_object();
//json要素をセット
json_t* json_fileinfo = json_object();
if (json_fileinfo) {
//filename
json_object_set(json_fileinfo, "filename", json_string("abcdefg.txt"));
//number
json_object_set(json_fileinfo, "number", json_integer((json_int_t)1));
//ver
json_object_set(json_fileinfo, "ver", json_real((double)1.2));
//ルートにセット
json_object_set(json_root, "fileInfo", json_fileinfo);
json_decref(json_fileinfo);
}
//array-section
json_t* json_array_section = json_array();
if (json_array_section){
int array_no[] = { 1345, 7890, 9999 };
for (int i = 0; i < 3; i++) {
json_t* section = json_object();
json_object_set(section, "No", json_integer((json_int_t)array_no[i]));
json_array_append(json_array_section, section);
}
json_object_set(json_root, "array-section", json_array_section);
json_decref(json_array_section);
}
printf("%s\n", json_dumps(json_root, json_object_size(json_root)));
// dump
json_decref(json_root);
}
シリアライズ化の実行結果
Jsonファイルを逆シリアライズ化する方法
Jsonファイルを逆シリアライズ化する方法です。(jsonファイルを読み込み)
まずは、Jsonファイルをロードする部分から。
int main() {
json_t* json_root;
json_error_t json_error;
json_root = json_load_file("config.json", 0, &json_error);
if ( !json_root ) {
fprintf(stderr, "%s", json_error.text);
exit(-1);
}
/*処理*/
/*利用後に解放*/
json_decref(json_root);
}
次は、逆シリアライズ化のサンプルコードです。
#include <jansson.h>
#include <string.h>
typedef struct {
const char* filename;
int number;
double ver;
int array[3];
} FileInfo;
int main(int argc, char* argv[]) {
if (argc != 2) {
printf("json file not set");
exit(1);
}
//Jsonファイル読み込み
json_t* json_root;
json_error_t json_error;
json_root = json_load_file(argv[1], 0, &json_error);
if (!json_root) {
fprintf(stderr, "%s", json_error.text);
exit(-1);
}
//jsonファイルオブジェクトを取得
FileInfo info;
json_t* json_orign;
json_orign = json_object_get(json_root, "fileInfo");
if (json_orign) {
json_t* json_value;
//file-name
json_value = json_object_get(json_orign, "file-name");
info.filename = json_string_value(json_value);
//No
json_value = json_object_get(json_orign, "No");
info.number = json_integer_value(json_value);
//ver
json_value = json_object_get(json_orign, "ver");
info.ver = json_real_value(json_value);
//dump
json_decref(json_value);
printf("filename:%s\nnumber:%d\nver:%f\n", info.filename, info.number,info.ver);
}
json_orign = json_object_get(json_root, "array-section");
if (json_orign) {
//array_section
json_t* json_value;
json_t* item;
for (size_t i = 0; ; i++) {
item = json_array_get(json_orign, i);
if (!item) {
break;
}
json_value = json_object_get(item, "No");
if (json_value) {
info.array[i] = json_integer_value(json_value);
printf("No:%d\n", info.array[i]);
}
json_decref(json_value);
}
}
// dump
json_decref(json_root);
}
各型のオブジェクトの取得方法
それぞれの型に応じた取得方法は以下です。
逆シリアライズ化の実行結果
参考
以下が今回参考にしたJanssonドキュメントです。
API Reference — Jansson 2.8 documentation
コメント