お茶漬けびより

学んだことを整理する場所です。主に、C++, Unreal Engine 4 (UE4) を扱います。たまに趣味や雑記も。現在(2017/7/1より)無職です。

JSON for Modern C++ を使ってみたメモ

メモ書き

github.com

JSON for Modern C++ とは?

以下、参照。

mattn.kaoriya.net

使い方

Github のページの json/src/json.hpp というファイルがあるので、これを include する。

#include "json.hpp"
using json = nlohmann::json;

この json クラスを使って、JSON ファイルを読んだり書いたりする。

以下のような JSON ファイルを使って、例を示していく。 ファイル名は、test.json として進めていく。

{
  "pi": 3.141,
  "happy": true,
  "name": "Niels",
  "nothing": null,
  "answer": {
    "everything": 42
  },
  "list": [1, 0, 2],
  "object": {
    "currency": "USD",
    "value": 42.99
  }
}

JSON ファイルの読み込み

JSON ファイルを読む必要があるので、まずはファイルを読む。

std::ifstream reading("test.json", std::ios::in);

ファイルの入出力は以下を参照。

qiita.com

ファイルを読んだら以下のようにして取り出す。

json j;
reading >> j;

これだけで、ファイルの中身がすべて json j に入っている。 試しに以下のように出力すると

reading >> j;
std::cout << j << std::endl;

以下のように出力される。

{"answer":{"everything":42},"happy":true,"list":[1,0,2],"name":"Niels","nothing":null,"object":{"currency":"USD","value":42.99},"pi":3.141}

改行はしてくれないっぽい。

このデータだけ取り出したいってときは、以下のようにする。

std::cout << j["pi"] << std::endl;
// 出力結果は、3.141

begin(), end() を使って取り出すことができる。

std::for_each(j.begin(), j.end(), [](auto it) {
    std::cout << it << std::endl;
});

結果は、以下のようなる。

{"everything":42}
true
[1,0,2]
"Niels"
null
{"currency":"USD","value":42.99}
3.141

begin, end を使うとアルファベット順になる。

C++17 だと以下のように書ける。

for (auto& elem : j) {
    std::cout << elem << std::endl;
}

JSON ファイルへ書き込み

未調査…

おわり

とても使いやすい。まだまだ調べ切れていないので、分かり次第更新していく予定。