nlib
nn::nlib::msgpack 名前空間

MessagePackのシリアライザ及びJSONパーサー/ライター, CSVパーサーが実装されています。 [詳解]

名前空間

 jsonrpc
 JSON-RPC 2.0 を実装しています。
 

クラス

class  CsvReader
 CSVパーサーです。ストリームからCSV文字列を読み込んでパースします。 [詳解]
 
class  JsonPatch
 JSON Patch (RFC-6902)を適用するためのクラスです。 [詳解]
 
class  JsonPatchBuilder
 JSON Patch (RFC-6902)を作成するためのクラスです。 [詳解]
 
class  JsonStreamGenerator
 JSON又はmsgpackを出力するためのクラスです。 [詳解]
 
struct  JsonStreamGeneratorSettings
 JsonStreamGeneratorの設定パラメータ群を格納する構造体です。 [詳解]
 
class  JsonStreamParser
 JSON又はmsgpackをプル形式でパースするためのクラスです。 [詳解]
 
struct  JsonStreamParserSettings
 JsonStreamParserの設定パラメータ群を格納する構造体です。 [詳解]
 
class  MpObject
 MessagePack又はJSONを読み込むことで作成されるオブジェクトです。 [詳解]
 
struct  MpObjectKv
 MpObject型のキーと値のペアです。連想配列を格納するために利用されます。 [詳解]
 
class  MpWalker
 メモリ上に展開されたMessagePackのデータに高速にアクセスします。 [詳解]
 
struct  nil
 MessagePackのnil, 及びJSONのnullに対応するクラスです。 [詳解]
 

関数

template<class T >
bool operator== (const nil &lhs, const T &rhs) noexcept
 rhsnil以外のオブジェクトでfalseを返します。
 
template<class T >
bool operator== (const T &lhs, const nil &rhs) noexcept
 lhsnil以外のオブジェクトでfalseを返します。
 
bool operator== (const nil &lhs, const nil &rhs) noexcept
 trueを返します。
 
template<class T >
bool operator!= (const nil &rhs, const T &lhs) noexcept
 rhsnil以外のオブジェクトでtrueを返します。
 
template<class T >
bool operator!= (const T &rhs, const nil &lhs) noexcept
 lhsnil以外のオブジェクトでtrueを返します。
 
bool operator!= (const nil &rhs, const nil &lhs) noexcept
 falseを返します。
 
bool operator== (const MpObjectKv &lhs, const MpObjectKv &rhs) noexcept
 再帰的に比較して、lhsrhs が等価な場合はtrueを返します。
 
bool operator!= (const MpObject &lhs, const MpObject &rhs) noexcept
 再帰的に比較して、lhsrhs が等価な場合はfalseを返します。
 
bool operator!= (const MpObjectKv &lhs, const MpObjectKv &rhs) noexcept
 再帰的に比較して、lhsrhs が等価な場合はfalseを返します。
 
MpObject

MpObjectを扱うためのフリー関数です。

template<class T >
errno_t Box (MpObject *obj, const T &v)
 この関数テンプレートを特殊化してユーザー型のボックス化を定義することが可能です。 [詳解]
 
template<class T >
errno_t Unbox (const MpObject *obj, T *v)
 この関数テンプレートを特殊化してユーザー型のアンボックス化を定義することが可能です。 [詳解]
 
bool operator== (const MpObject &lhs, const MpObject &rhs)
 2つのMpObjectを再帰的に比較します。等価であればtrueを返します。 [詳解]
 

詳解

MessagePackのシリアライザ及びJSONパーサー/ライター, CSVパーサーが実装されています。

説明

MessagePackは、バイナリベースのオブジェクトシリアライズのためのフォーマットの1つです。 MessagePackを使うとデータを高速・省サイズかつ柔軟にやりとりすることが可能です。 データ形式はJSONをバイナリに変換したようなフォーマットになっているので、JSONを利用する処理を高速なものに置き換えたい場合にも利用されることが多いようです。 また、MessagePackはJSONと同様にPerl, Python, Ruby等の環境でも読み書きできるので、データを異なる環境の異なる言語とやりとりする用途に使うことが可能です。

本ライブラリについて
nn::nlib::msgpackでは、このMessagePackに対応したシリアライザとデシリアライザ、及びJSONのパーサーとジェネレータを実装しています。 MessagePackのデータもJSONのデータも読み込んだ後は同じデータ形式に変換されるので、JSONで読み込んでMessagePackで保管、又はその逆、といった作業を簡単に行うことが可能です。
JSONパーサーのRFC 7159への適合性について
JSONについてはRFC 7159に定義が記述されていますが、このライブラリのJSONパーサーのRFCへの適合性について説明いたします。
  • エンコーディングについて、RFC 7159ではUTF-8, UTF-16, UTF-32を解釈するように求められていますが、msgpackライブラリはUTF-8のみを解釈します。
  • ヌル文字を含む文字列について、ヌル文字を含む文字列、例えば"A\u0000Z"はパースエラーになりません。 これはRFC通りなのですが、この例をC文字列として解釈しようとすると"A"として解釈されます。
  • 数値について、JSONには実数と整数の区別がありませんが、読み取り時には、符号なし整数(uint64_t)、符号つき整数(int64_t)、浮動小数(double)、の優先順で解釈を試みます。 ただし、符号を除いて19桁以上の整数は浮動小数型として読み取ります。 実際の数値の読み取りはnlib_strto_int32()関数等を利用して実装されています。 なお、一般にJSONで大きな数値を扱う際にはJSONの処理系によって挙動が異なる場合があるので、数値としてより文字列として扱うことをお勧めいたします。
参照
https://tools.ietf.org/html/rfc7159 (RFC 7159, JSON)
http://www.7key.jp/rfc/rfc4627.html (RFC 4627, JSON, in Japanese)
https://www.ietf.org/rfc/rfc4180.txt (RFC 4180, CSV)
http://www.kasai.fm/wiki/rfc4180jp (RFC 4180, CSV, in Japanese)
http://msgpack.org/ (MessagePack)

関数詳解

◆ Box()

template<class T >
nn::nlib::msgpack::Box ( MpObject obj,
const T &  v 
)

この関数テンプレートを特殊化してユーザー型のボックス化を定義することが可能です。

テンプレート引数
Tボックス化対象となるオブジェクトの型
引数
[in]objボックス化されたデータが格納されるオブジェクト
[in]vボックス化対象となるオブジェクト
戻り値
0ならば成功
説明
MpObjectでのオブジェクトのボックス化の動作をカスタマイズすることが可能です。
実装の際の注意点を箇条書きにします。
  • obj には非NULLの値が渡されます。
  • ボックス化に成功した場合は0を、そうでない場合は0以外の値を返す必要があります。
  • この関数から再帰的にボックス化を行うことができますが、戻り値のエラーチェックを行う必要があります。

◆ operator==()

nn::nlib::msgpack::operator== ( const MpObject lhs,
const MpObject rhs 
)

2つのMpObjectを再帰的に比較します。等価であればtrueを返します。

再帰的に比較して、lhsrhs が等価な場合はtrueを返します。

引数
[in]lhs比較するMpObject
[in]rhs比較するMpObject
戻り値
等価ならばtrue
説明
利用上の注意点は以下のとおりです。
  • 静的型のオブジェクトを比較する場合に比べて低速なこと
  • 連想配列はキーの並び順が異なる場合、等価でないとされること
  • 浮動小数型を比較する場合、誤差は考慮されないこと

◆ Unbox()

template<class T >
nn::nlib::msgpack::Unbox ( const MpObject obj,
T *  v 
)

この関数テンプレートを特殊化してユーザー型のアンボックス化を定義することが可能です。

テンプレート引数
Tアンボックス化されたデータが格納されるオブジェクトの型
引数
[in]objボックス化されたデータが格納されているオブジェクト
[in]vアンボックス化されたデータが格納されるオブジェクト
戻り値
0ならば成功
説明
実装の際の注意点を箇条書きにします。
  • objv には非NULLの値が渡されます。
  • アンボックス化に成功した場合は0を、そうでない場合は0以外の値を返す必要があります。
  • この関数から再帰的にアンボックス化を行うことができますが、戻り値のエラーチェックを行う必要があります。
  • 連想配列をアンボックス化する場合には、キーの順番に依存しない実装を行う必要があります。