Lyの日常

主が楽しくプログラムをカキカキするブログ

俺でもわかるPicojsonの使い方

f:id:akira206:20160626201512p:plain

PicojsonはJson形式を解析するライブラリです

Jsonとは

軽量のデータ交換フォーマットです。
人間にとって読み書きが容易で、
マシンにとっても簡単にパースや生成を行なえる形式です。
--www.json.org/json-ja.html

ゲームの内部データを読み込む際に
テキスト形式だと解析が困難ですが
Json形式であればライブラリを使用して楽に読み込むことができます

PicojsonをGithubから取ってくる

Kazuhoさんに感謝
github.com

Picojsonはヘッダーオンリーなので
picojson.hだけで機能します

json形式のデータを用意する

# data.json
{
  "Player": {
    "Name": "Yanai"
  }
}

Picojsonを使ってデータを取得

#include <iostream> // std::cout
#include <fstream>  // std::ifstream
#include <cassert>  // std::assert

#include "picojson.h"


int main() {
  // ファイルを読み込むための変数
  std::ifstream fs;
  
  // ファイルを読み込む
  fs.open("data.json", std::ios::binary);
  
  // 読み込みチェック
  // fs変数にデータがなければエラー
  assert(fs);

  // Picojsonへ読み込む
  picojson::value val;
  fs >> val;
  
  // fs変数はもう使わないので閉鎖
  fs.close();
  
  // Playerの名前を取得
  std::string name = val.get<picojson::object>()
                      ["Player"].get<picojson::object>()
                      ["NAME"].get<std::string>();
}

picojson::objectはmapで生成されているので
[]でKeyを指定してそれに対になっている値を取得します

\\* 注意点
Picojsonではdouble型での数値の取得しか対応していません

コードからjson形式のデータを生成する方法

picojson::object obj;

// データの追加
obj.emplace(std::make_pair("Name", "Yanai"));

// 文字列にするためにvalueを使用
picojson::value val(obj);

// return std::string
val.serialize();

std::cout << val.serialize(); // {"Name": "Yanai"}