LoginSignup
2
0

More than 3 years have passed since last update.

jsonnet を C++11 アプリに組み込むメモ

Posted at

背景

  • glTF などの JSON フォーマットの管理がめんどい.
    • JSON にちょっとしたプログラミング機能がほしい
    • ノードのインデックスを変数で指定したりとか
    • 他の JSON ファイルを読み込みたい
    • etc

python で処理するてもあるけど, C++11 アプリで完結させたい.

jsonnet というのがありました.

オフィシャルのページにはドキュメントがほとんどありません.

Kubernetesマニフェスト記述言語としてのJsonnet
https://qiita.com/ktateish/items/701a61e2be44ad012596

逆引き Jsonnet
https://qiita.com/ktateish/items/c07d76fb268575f5a8dc

ありがとうございます :pray:

便利そうですので, 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 生成を試す
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0