CLX C++ Libraries
Home >> json

Declrations

template <
    class CharT,
    class Traits = std::char_traits<CharT>
>
class json_separator;

template <
    class CharT,
    class Traits = std::char_traits<CharT>
>
class basic_json_array;

typedef basic_tokenmap<json_separator<char>, std::string, std::string> json
typedef basic_json_array<char> json_array;
#ifdef CXL_USE_WCHAR
typedef basic_tokenmap<json_separator<wchar_t>, std::wstring, std::wstring> wjson
typedef basic_json_array<wchar_t> wjson_array;
#endif

Overview

json,および json_array は,JSON 形式データの解析を行うためのクラス群です. json は,JSON 形式データの object ("{" で始まり,"}" で終わる文字列)を解析し,json_array は array ("[" で始まり,"]" で終わる文字列)を解析します.JSON 形式データの書式の詳細については,JSON の紹介を参照して下さい.

json は,object の中に array や object が存在する場合,その部分の再帰的な解析は行わず, 文字列のまま返します.該当箇所の解析が必要な場合は,返された文字列を引数にして再度 json,または json_array を用いて解析を行って下さい.json_array は,array に含まれる文字列を object とそれ以外に分けて解析します. 解析結果は,それぞれ objects(),strings() メソッドで取得することができます.

json,および json_array は,stringnumber,true,false,null を全て文字列として格納し,その結果を返します (e.g., true->"true", false->"false", null->"null").

Example

example_json.cpp

// ワイド文字関連のCLXライブラリを使用するために必要
#ifndef CLX_USE_WCHAR
#define CLX_USE_WCHAR
#endif

#include <iostream>
#include <string>
#include "clx/http.h"
#include "clx/uri.h"
#include "clx/code_convert.h"
#include "clx/json.h"

int main(int argc, char* argv[]) {
    if (argc < 3) std::exit(-1);
    
    clx::http session(clx::uri::encode(argv[1]));
    if (!session.get(clx::uri::encode(argv[2]))) {
        std::cerr << "failed to get response" << std::endl;
        std::exit(-1);
    }
    
    /*
     * parse a hatena bookmark entry.
     * はてなのJSONは()で括られているので,その部分は除外.
     */
    std::wstring body = clx::code_convert<wchar_t>(session.body());
    clx::wjson hateb(body.begin() + 1, body.end() - 1);
    
    std::wcout.imbue(std::locale("japanese"));
    for (clx::wjson::iterator pos = hateb.begin(); pos != hateb.end(); pos++) {
        std::wcout << pos->first << L": " << pos->second << std::endl;
    }
    std::wcout << std::endl;
    
    if (hateb.find(L"bookmarks") == hateb.end()) return 0;
    
    // parse and print the detail of "bookmarks"
    clx::wjson_array bk(hateb[L"bookmarks"]);
    std::wcout << L"bookmarks have " << bk.objects().size() << L" object, "
        << bk.strings().size() << L" string" << std::endl;
    std::wcout << L"-----" << std::endl;
    for (size_t i = 0; i < bk.objects().size(); i++) {
        std::wcout << L"object " << i << L":" << std::endl;
        for (clx::wjson::iterator pos = bk.object(i).begin();
            pos != bk.object(i).end(); pos++) {
            std::wcout << L"\t" << pos->first << L": " << pos->second << std::endl;
        }
    }
    
    return 0;
}
Result
$ ./test b.hatena.ne.jp "/entry/json/?url=http://d.hatena.ne.jp/tt_clown/20080823/p1"
bookmarks: [{"comment":" ","timestamp":"2008/08/25 16:01:00","user":"HISAMATSU",
"tags":["\u306f\u3066\u306a","ruby"]},{"comment":"\u306f\u3066\u306a\u30d6\u30c3
\u30af\u30de\u30fc\u30af\u3000\u985e\u4f3c","timestamp":"2008/08/24 21:11:03",
"user":"poafag","tags":["ruby","\u306f\u3066\u306a"]}]
count: 2
eid: 9756340
entry_url: http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/tt_clown/20080823/p1
related: []
screenshot: http://screenshot.hatena.ne.jp/images/120x90/0/f/f/9/5
/d9701e8c6a5392d9a3a729155d07315e310.jpg
title:  github::clown::ruby-hatena - Life like a clown
url: http://d.hatena.ne.jp/tt_clown/20080823/p1

bookmarks have 2 object, 0 string
-----
object 0:
        comment:  
        tags: ["\u306f\u3066\u306a","ruby"]
        timestamp: 2008/08/25 16:01:00
        user: HISAMATSU
object 1:
        comment: はてなブックマーク 類似
        tags: ["ruby","\u306f\u3066\u306a"]
        timestamp: 2008/08/24 21:11:03
        user: poafag

Template Parameters

json

tokenmap を参照して下さい.

json_array

CharT
文字の型を指定します.
Traits
文字列を扱うためのtraitsを指定します.デフォルト値は, std::char_traits<CharT>.

Related Types

json

tokenmap を参照して下さい.

json_array

typedef CharT char_type;
typedef std::basic_string<CharT, Traits> string_type;
typedef basic_tokenmap<json_separator<CharT, Traits>, string_type,
    string_type> object_type;
typedef size_t size_type;

Construction and Member Functions

json

tokenmap を参照して下さい.

json_array

basic_json_array();

template <class InIter>
explicit basic_json_array(InIter first, InIter last);

explicit basic_json_array(const string_type& src);
explicit basic_json_array(const char_type* src);

virtual ~basic_json_array();

void reset();

template <class InIter>
basic_json_array& assign(InIter first, InIter last);

basic_json_array& assign(const string_type& src);
basic_json_array& assign(const char_type* src);

入力イテレータ,または文字列を指定して解析を行います.解析結果は,object とそれ以外に分かれて内部変数で保持されます.

std::vector<object_type>& objects();
const std::vector<object_type> objects() const;

object_type& object(size_type index);
const object_type& object(size_type index) const;

std::vector<string_type>& strings();
const std::vector<string_type>& strings() const;

string_type& string(size_type index);
const string_type& string(size_type index) const;

objects(),strings() メソッドは,解析結果を格納した配列全体を返します.これに対して, object(),string() メソッドは,引数に指定された添え字に対応する object, および文字列を返します.

Related Pages

  1. CLX C++ Libraries - tokenmap
  2. CLX C++ Libraries - tokenizer_func

Referrences

  1. Life like a clown - ワイド文字と codecvt
  2. JSON の紹介