背景
- glTF などの JSON フォーマットの管理がめんどい.
- JSON にちょっとしたプログラミング機能がほしい
- ノードのインデックスを変数で指定したりとか
- 他の JSON ファイルを読み込みたい
- etc
python で処理するてもあるけど, C++11 アプリで完結させたい.
jsonnet というのがありました.
オフィシャルのページにはドキュメントがほとんどありません.
Kubernetesマニフェスト記述言語としてのJsonnet
https://qiita.com/ktateish/items/701a61e2be44ad012596
逆引き Jsonnet
https://qiita.com/ktateish/items/c07d76fb268575f5a8dc
ありがとうございます
便利そうですので, C++11 アプリに取り込んで使えるようにしてみたいと思います.
libjsonnet-cpp
libjsonnet のコード自体は, ほぼライブラリ依存関係がなくていいのですが(md5 と nlohmann 先生の json.hpp 程度), 本家の jsonnet repo は CMake がイケてなかったり, std.jsonnet.h を毎回生成しないとかいけなくてめんどいので, 組み込みやすくしたものを作りました.
Visual Studio にも対応してます.
C++ API
#include "libjsonnet++.h"
して,
evaluteFile
or evaluateSnippet
を使います.
だいたいこの API だけで事足ります.
#include <fstream>
#include <iostream>
#include "libjsonnet++.h"
static std::string readFile(const std::string& filename)
{
std::ifstream in(filename);
if (!in.good()){
std::cerr << "Could not open: " << filename;
return "";
}
return std::string(std::istreambuf_iterator<char>(in), std::istreambuf_iterator<char>());
}
int main(int argc, char **argv)
{
if (argc < 2) {
std::cout << "Needs input.jsonnet\n";
return EXIT_FAILURE;
}
jsonnet::Jsonnet jsonnet;
jsonnet.init();
std::string output;
//bool ret = jsonnet.evaluateFile(argv[1], &output);
//if (!ret) {
// std::cerr << jsonnet.lastError() << "\n";
// return EXIT_FAILURE;
//}
const std::string input = readFile(argv[1]);
bool ret = jsonnet.evaluateSnippet("dummy", input, &output);
if (!ret) {
std::cerr << jsonnet.lastError() << "\n";
return EXIT_FAILURE;
}
std::cout << output;
return EXIT_SUCCESS;
}
お手軽でいいですね.
TODO
- JSONPath などを試す
- 複数 JSON 生成を試す