mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

C++ - JSON データの解析(by picojson)!

[ プログラミング ] [ C言語, JSON ]

こんばんは。

GNU C++ で JSON データを読み込んで解析する方法についての記録です。

ライブラリは定番の、そしてヘッダファイルの配置だけで済む “picojson” を使用します。(他に JSON-C や rapidjson 等もあるかと思いますが)

0. 前提条件

  • Linux Mint 17(64bit) での作業を想定。

1. picojson 準備

kazuho/picojson - a header-file-only, JSON parser serializer in C++” から “picojson.h” をダウンロードし適切な場所へ配置する。(今回は作成する C++ ソースと同じディレクトリへ配置した)

2. JSON データ準備

テスト読み込み用の JSON データファイルを作成。(文字エンコード: UTF-8)
(整数、小数、文字列(日本語含む)、真偽、配列のデータを盛り込んでいる)

test.json
1
2
3
4
5
6
7
8
9
10
11
12
13
{
  "Test1": {
    "TestInt": 1234,
    "TestDbl": 0.1234,
    "TestStr": "JSON Test 一二三",
    "TestBln": true,
    "TestAry": [
      "JSON TEST 1-1",
      "JSON TEST 1-2",
      "JSON TEST 1-3"
    ]
  }
}

3. C++ ソースコード作成

テスト用に以下のようなコードを作成。

PicoJson.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// g++ -Wall -O2 -o PicoJson picojson.h PicoJson.cpp
/*
 * C++ source code to parse json datas by picojson.
 */
#include <string>
#include <sstream>
#include <fstream>
#include <iostream>
#include "picojson.h"

using namespace std;
using namespace picojson;

int main() {
    // Declaration
    stringstream ss;
    ifstream     f;
    unsigned int i;

    // Read Json file
    f.open("test.json", ios::binary);
    if (!f.is_open()) return 1;
    ss << f.rdbuf();
    f.close();

    // Parse Json data
    value v;
    ss >> v;
    string err = get_last_error();
    if(!err.empty()) {
        cerr << err << endl;
        return -1;
    }
    object& o = v.get<object>()["Test1"].get<object>();
    cout << "TestInt: " << o["TestInt"].get<double>() << endl;
    cout << "TestDbl: " << o["TestDbl"].get<double>() << endl;
    cout << "TestStr: " << o["TestStr"].get<string>() << endl;
    cout << "TestBln: " << o["TestBln"].get<bool>()   << endl;
    array& aAry = o["TestAry"].get<array>();
    cout << "TestAry:" << endl;
    for (i = 0; i < aAry.size(); i++)
        cout << "\t" << aAry[i].get<string>() << endl;
}

ちなみに、整数取得用のメソッドはないが、 “double” で取得可能。

4. ビルド

作成した C++ を以下のようにビルド。(-Wall 警告も出力するオプション、-O2 最適化のオプション)

1
$ g++ -Wall -O2 -o PicoJson picojson.h PicoJson.cpp

5. 動作確認

確認のために実行。

1
2
3
4
5
6
7
8
9
$ ./PicoJson
TestInt: 1234
TestDbl: 0.1234
TestStr: JSON Test 一二三
TestBln: 1
TestAry:
        JSON TEST 1-1
        JSON TEST 1-2
        JSON TEST 1-3

9. 参考サイト


Yaml 同様 Json データも何かとよく使用するため、記録しておいた次第です。(当方の場合、 Twitter API でよく使用する)

速度を重視した処理を行いたければ、"picojson" より高速と言われている “rapidjson” の導入を考えてもよいでしょう。

以上。

Comments