Help us understand the problem. What is going on with this article?

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

背景

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

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

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

https://jsonnet.org/

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

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 を毎回生成しないとかいけなくてめんどいので, 組み込みやすくしたものを作りました.

https://github.com/syoyo/libjsonnet-cpp

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 生成を試す
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした