nlib
nn::nlib::msgpack::JsonStreamParser クラスfinal

JSON又はmsgpackをプル形式でパースするためのクラスです。 [詳解]

#include "nn/nlib/msgpack/JsonStreamParser.h"

クラス

struct  Detail
 エラーが発生した場合、pathにエラーが発生した箇所を示す文字列が格納されます。 [詳解]
 
struct  Token
 パーサーが取得したトークンに関するデータが格納されています。 [詳解]
 

公開型

enum  Event {
  kNone = -1,
  kEventNull = 1,
  kEventTrue,
  kEventFalse,
  kEventString,
  kEventNumberInt32,
  kEventNumberUint32,
  kEventNumberInt64,
  kEventNumberUint64,
  kEventNumberFloat,
  kEventNumberDouble,
  kEventStartArray,
  kEventEndArray,
  kEventStartMap,
  kEventEndMap,
  kEventKeyName,
  kEventBinary,
  kEventExt,
  kEventEndDocument
}
 JsonStreamParser::Next()及びTokenで利用される型で、パーサーが読み込んだデータに対応するイベントです。 [詳解]
 

公開メンバ関数

errno_t Open (InputStream *stream) noexcept
 ストリームを指定してパースを開始します。 [詳解]
 
errno_t Close () noexcept
 パーサーをクローズして初期化直後の状態に設定します。 [詳解]
 
bool HasNext () const noexcept
 次に遷移する状態がある(読み込んでいるJSON又はmsgpackが終了していない)場合はtrueを返します。
 
Event Next () noexcept
 JSON又はmsgpackを読み込みパーサー内の状態を遷移します。 [詳解]
 
bool Skip () noexcept
 値、配列全体、連想配列全体を1つ読み飛ばします。 [詳解]
 
int GetLine () const noexcept
 JSONを読み込んでいる場合は現在の行数を返します。
 
int GetColumn () const noexcept
 JSONを読み込んでいる場合は現在の桁数を返します。
 
const TokenGetToken () const noexcept
 トークンを取得します。 [詳解]
 
コンストラクタ、デストラクタ、及び初期化
constexpr JsonStreamParser () noexcept
 デフォルトコンストラクタです。
 
 ~JsonStreamParser () noexcept
 デストラクタです。
 
 JsonStreamParser (JsonStreamParser &&rhs) noexcept
 ムーブコンストラクタです。
 
JsonStreamParseroperator= (JsonStreamParser &&rhs) noexcept
 ムーブ代入演算子です。
 
errno_t Init (const JsonStreamParserSettings &settings) noexcept
 動作オプションを指定して初期化を行います。成功した場合は0を返します。 [詳解]
 
errno_t Init () noexcept
 上記関数の引数省略版で、settingsをデフォルト値で渡します。
 
エラーチェック
Error GetError () const noexcept
 エラーを取得します。 [詳解]
 
 operator bool () const
 オブジェクトが初期化済みで内部でエラーが発生していなければtrue、発生していればfalseを返します。
 

静的公開メンバ関数

static errno_t Parse (JsonStreamParser *parser, UniquePtr< MpObject > &obj, bool peek, Detail *detail) noexcept
 JSON又はmsgpackをパースして、MpObjectを作成します。 [詳解]
 
static errno_t Parse (JsonStreamParser *parser, UniquePtr< MpObject > &obj, bool peek) noexcept
 上記関数の引数省略版で、nullptrを引数として渡します。
 
static errno_t Parse (JsonStreamParser *parser, UniquePtr< MpObject > &obj) noexcept
 上記関数の引数省略版で、falseを引数として渡します。
 
static errno_t Parse (UniquePtr< MpObject > &obj, const void *data, size_t n, const JsonStreamParserSettings &settings, Detail *detail) noexcept
 JSON又はmsgpackをパースして、MpObjectを作成します。 [詳解]
 
static errno_t Parse (UniquePtr< MpObject > &obj, const void *data, size_t n, const JsonStreamParserSettings &settings) noexcept
 上記関数の引数省略版で、nullptrを引数として渡します。
 
static errno_t Parse (UniquePtr< MpObject > &obj, const void *data, size_t n) noexcept
 上記関数の引数省略版で、settingsをデフォルト値で渡します。
 
static errno_t Parse (UniquePtr< MpObject > &obj, const nlib_utf8_t *str, const JsonStreamParserSettings &settings, Detail *detail) noexcept
 JSONをパースして、MpObjectを作成します。 [詳解]
 
static errno_t Parse (UniquePtr< MpObject > &obj, const nlib_utf8_t *str, const JsonStreamParserSettings &settings) noexcept
 上記関数の引数省略版で、nullptrを引数として渡します。
 
static errno_t Parse (UniquePtr< MpObject > &obj, const nlib_utf8_t *str) noexcept
 上記関数の引数省略版で、settingsをデフォルト値で渡します。
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (JsonStreamParser *parser, bool peek, Detail *detail) noexcept
 JSON又はmsgpackをパースして、MpObjectを作成して返します。 [詳解]
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (JsonStreamParser *parser, bool peek) noexcept
 上記関数の引数省略版で、nullptrを引数として渡します。
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (JsonStreamParser *parser) noexcept
 上記関数の引数省略版で、falseを引数として渡します。
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (const nlib_byte_t *first, const nlib_byte_t *last, const JsonStreamParserSettings &settings, Detail *detail) noexcept
 msgpackをパースして、MpObjectを作成して返します。 [詳解]
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (const nlib_byte_t *first, const nlib_byte_t *last, Detail *detail) noexcept
 上記関数の引数省略版で、settingsをデフォルト値で渡します。
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (const nlib_byte_t *first, const nlib_byte_t *last, const JsonStreamParserSettings &settings) noexcept
 上記関数の引数省略版で、nullptrを引数として渡します。
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (const nlib_byte_t *first, const nlib_byte_t *last) noexcept
 上記関数の引数省略版で、settingsをデフォルト値で渡します。
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (const MpWalker &walker, const JsonStreamParserSettings &settings, Detail *detail) noexcept
 Parse(walker.GetPtr(), walker.GetPtr() + walker.GetSize(), settings, detail)を実行します。 [詳解]
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (const MpWalker &walker, Detail *detail) noexcept
 上記関数の引数省略版で、settingsをデフォルト値で渡します。
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (const MpWalker &walker, const JsonStreamParserSettings &settings) noexcept
 上記関数の引数省略版で、nullptrを引数として渡します。
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (const MpWalker &walker) noexcept
 上記関数の引数省略版で、settingsをデフォルト値で渡します。
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (const nlib_utf8_t *str, const JsonStreamParserSettings &settings, Detail *detail) noexcept
 JSONをパースして、MpObjectを作成して返します。 [詳解]
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (const nlib_utf8_t *str, const JsonStreamParserSettings &settings) noexcept
 上記関数の引数省略版で、nullptrを引数として渡します。
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (const nlib_utf8_t *str, Detail *detail) noexcept
 上記関数の引数省略版で、settingsをデフォルト値で渡します。
 
static std::pair< errno_t, UniquePtr< MpObject > > Parse (const nlib_utf8_t *str) noexcept
 
パースされた数値変換

数値型のトークンを指定した型へ変換します。

static errno_t ToInt32 (const Token &token, int32_t *number) noexcept
 数値トークンをint32_tへキャストします。 [詳解]
 
static errno_t ToUint32 (const Token &token, uint32_t *number) noexcept
 数値トークンをuint32_tへキャストします。 [詳解]
 
static errno_t ToInt64 (const Token &token, int64_t *number) noexcept
 数値トークンをint64_tへキャストします。 [詳解]
 
static errno_t ToUint64 (const Token &token, uint64_t *number) noexcept
 数値トークンをuint64_tへキャストします。 [詳解]
 
static errno_t ToFloat (const Token &token, float *number) noexcept
 数値トークンをfloatへキャストします。 [詳解]
 
static errno_t ToDouble (const Token &token, double *number) noexcept
 数値トークンをdoubleへキャストします。 [詳解]
 
static errno_t ToTimestamp (const Token &token, nlib_time *t) noexcept
 タイムスタンプをnlib_timeへ変換します。 [詳解]
 
static std::pair< errno_t, int32_t > ToInt32 (const Token &token) noexcept
 数値トークンをint32_tへキャストします。 [詳解]
 
static std::pair< errno_t, uint32_t > ToUint32 (const Token &token) noexcept
 数値トークンをuint32_tへキャストします。 [詳解]
 
static std::pair< errno_t, int64_t > ToInt64 (const Token &token) noexcept
 数値トークンをint64_tへキャストします。 [詳解]
 
static std::pair< errno_t, uint64_t > ToUint64 (const Token &token) noexcept
 数値トークンをuint64_tへキャストします。 [詳解]
 
static std::pair< errno_t, float > ToFloat (const Token &token) noexcept
 数値トークンをfloatへキャストします。 [詳解]
 
static std::pair< errno_t, double > ToDouble (const Token &token) noexcept
 数値トークンをdoubleへキャストします。 [詳解]
 
static std::pair< errno_t, nlib_timeToTimestamp (const Token &token) noexcept
 タイムスタンプをnlib_timeへ変換します。msgpackのTimestamp extension typeをパースした場合のみに変換されます。 [詳解]
 

詳解

JSON又はmsgpackをプル形式でパースするためのクラスです。

説明
構文要素ごとにイベントを発生させ、それをユーザー側が処理することでパースを進めていきます。 パース処理は以下のようなコードによって発生したイベントを取得することで進められます。
const nlib_utf8_t* json = R"({"key1" : "value", "key2" : [-1,2,12345678901,1.2], "key3" : [true, false, null]})";
MemoryInputStream stream(json, nlib_strlen(json));
SUCCEED_IF(parser.Init() == 0);
SUCCEED_IF(parser.Open(&stream) == 0);
while (parser.HasNext()) {
JsonStreamParser::Event ev = parser.Next();
SUCCEED_IF(!parser.GetToken().token_toobig);
switch (ev) {
case JsonStreamParser::kEventNull: EV_FOUND("null");
case JsonStreamParser::kEventTrue: EV_FOUND("true");
case JsonStreamParser::kEventFalse: EV_FOUND("false");
nlib_printf("String(%s) found\n", parser.GetToken().buf); break;
nlib_printf("Int32(%" PRId32 ") found\n", parser.GetToken().number.i32); break;
nlib_printf("Uint32(%" PRIu32 ") found\n", parser.GetToken().number.u32); break;
nlib_printf("Int64(%" PRId64 ") found\n", parser.GetToken().number.i64); break;
nlib_printf("Uint64(%" PRIu64 ") found\n", parser.GetToken().number.u64); break;
nlib_printf("Float(%f) found\n", parser.GetToken().number.f32); break;
nlib_printf("Double(%f) found\n", parser.GetToken().number.f64); break;
case JsonStreamParser::kEventStartArray: EV_FOUND("array open");
case JsonStreamParser::kEventEndArray: EV_FOUND("array close");
case JsonStreamParser::kEventStartMap: EV_FOUND("map open");
case JsonStreamParser::kEventEndMap: EV_FOUND("map close");
nlib_printf("Key(%s) found\n", parser.GetToken().buf); break;
// unreachable because parser.HasNext() becomes false
nlib_printf("End document found\n");
break;
default:
SUCCEED_IF(false); // error
}
}
SUCCEED_IF(!!parser);
parser.Close();
stream.Close();
/*
Output:
map open found
Key(key1) found
String(value) found
Key(key2) found
array open found
Int32(-1) found
Uint32(2) found
Uint64(12345678901) found
Double(1.200000) found
array close found
Key(key3) found
array open found
true found
false found
null found
array close found
map close found
*/
MpObjectとして利用したい場合は以下のようにより簡単に書くことができます。
const nlib_utf8_t* json = R"({"key1" : "value", "key2" : [-1,2,12345678901,1.2], "key3" : [true, false, null]})";
auto result = JsonStreamParser::Parse(json);
SUCCEED_IF(result.first == 0);
auto& mpobj_ptr = result.second; // std::unique_ptr<MpObject>
いずれの場合も、ストリームよりJsonStreamParserを先にクローズ(もしくはデストラクト)する必要があることに注意してください。

JsonStreamParser.h52 行目に定義があります。

列挙型メンバ詳解

◆ Event

JsonStreamParser::Next()及びTokenで利用される型で、パーサーが読み込んだデータに対応するイベントです。

列挙値
kNone 

何らかのエラーが発生しています。

kEventNull 

nullを読み込みました。

kEventTrue 

trueを読み込みました。

kEventFalse 

falseを読み込みました。

kEventString 

連想配列のキー以外の文字列を読み込みました。

kEventNumberInt32 

int32_t型の整数を読み込みました。

kEventNumberUint32 

uint32_t型の整数を読み込みました。

kEventNumberInt64 

int64_t型の整数を読み込みました。

kEventNumberUint64 

uint64_t型の整数を読み込みました。

kEventNumberFloat 

float型の浮動小数点数を読み込みました。

kEventNumberDouble 

double型の浮動小数点数を読み込みました。

kEventStartArray 

配列が開始しました。

kEventEndArray 

配列が終了しました。

kEventStartMap 

連想配列が開始しました。

kEventEndMap 

連想配列が終了しました。

kEventKeyName 

連想配列のキーを読み込みました。

kEventBinary 

バイナリデータを読み込みました(msgpackのみ)。

kEventExt 

拡張データを読み込みました(msgpackのみ)。

kEventEndDocument 

JSON又はmsgpackが終了しました(HasNext()falseを返した場合のNext()の戻り値)。

JsonStreamParser.h54 行目に定義があります。

関数詳解

◆ Close()

nn::nlib::msgpack::JsonStreamParser::Close ( )
noexcept

パーサーをクローズして初期化直後の状態に設定します。

戻り値
0成功した場合
説明
Open()で指定したストリームやTextReaderオブジェクトは、クローズされずこのクラスから切り離されます。

◆ GetError()

nn::nlib::msgpack::JsonStreamParser::GetError ( ) const
noexcept

エラーを取得します。

戻り値
JsonStreamParserが定義するエラー値
説明
以下の値のどれかを返します。
説明
kOk エラーは発生していません
kErrorColon ':'が見つかりませんでした
kErrorComma ','が見つかりませんでした
kErrorQuote '"'が見つかりませんでした
kErrorKeyTooLong 連想配列のキーが長すぎてトークンを格納するバッファに収まりませんでした
kErrorNumberTooLong 数値文字列が長すぎてトークンを格納するバッファに収まりませんでした
kErrorArrayTooBig 配列の大きさが指定された制限をオーバーしました
kErrorMapTooBig 連想配列の大きさが指定された制限をオーバーしました
kErrorCharacter 文字列にUTF-8でない文字が含まれています
kErrorNumberRange 数値が大きすぎるか小さすぎます
kErrorDepth 配列及び連想配列の深さが指定された制限をオーバーしました
kErrorToken その他読み込んだ文字列でエラーが発生しました
kErrorStream ストリームでエラーが発生しました

◆ GetToken()

nn::nlib::msgpack::JsonStreamParser::GetToken ( ) const
inlinenoexcept

トークンを取得します。

戻り値
直前のNext()で取得したトークン

JsonStreamParser.h312 行目に定義があります。

◆ Init()

nn::nlib::msgpack::JsonStreamParser::Init ( const JsonStreamParserSettings settings)
noexcept

動作オプションを指定して初期化を行います。成功した場合は0を返します。

引数
[in]settings動作オプション
戻り値
0成功した場合
EALREADY既に初期化済みの場合
ENOMEM内部でメモリ確保に失敗した場合
EINVAL動作オプションの指定が不正だった場合

◆ Next()

nn::nlib::msgpack::JsonStreamParser::Next ( )
noexcept

JSON又はmsgpackを読み込みパーサー内の状態を遷移します。

戻り値
読み込んだデータに対応するイベント
説明

◆ Open()

nn::nlib::msgpack::JsonStreamParser::Open ( InputStream stream)
noexcept

ストリームを指定してパースを開始します。

引数
[in]streamJSON又はmsgpackを読み込むストリーム
戻り値
0成功した場合
EINVALstreamNULL、又はJsonStreamParserが未初期化な場合
ENONEMメモリの確保に失敗した場合
EALREADY既にオープンされている場合

◆ Parse() [1/8]

nn::nlib::msgpack::JsonStreamParser::Parse ( JsonStreamParser parser,
UniquePtr< MpObject > &  obj,
bool  peek,
Detail detail 
)
staticnoexcept

JSON又はmsgpackをパースして、MpObjectを作成します。

引数
[in]parserパーサー
[out]objパース結果が格納されるMpObject
[in]peektrueならば、最初のトークンに既にNext()で取得済みのトークンを利用
[out]detailNULLでない場合、エラーが発生した箇所を示す文字列が格納されます。
戻り値
0ならば成功

◆ Parse() [2/8]

nn::nlib::msgpack::JsonStreamParser::Parse ( UniquePtr< MpObject > &  obj,
const void *  data,
size_t  n,
const JsonStreamParserSettings settings,
Detail detail 
)
staticnoexcept

JSON又はmsgpackをパースして、MpObjectを作成します。

引数
[out]objパース結果が格納されるMpObject
[in]dataJSON又はmsgpackが格納されたデータ列
[in]nデータ列のサイズ
[in]settingsパーサーの設定パラーメータ
[out]detailNULLでない場合、エラーが発生した箇所を示す文字列が格納されます。
戻り値
0ならば成功

◆ Parse() [3/8]

nn::nlib::msgpack::JsonStreamParser::Parse ( UniquePtr< MpObject > &  obj,
const nlib_utf8_t str,
const JsonStreamParserSettings settings,
Detail detail 
)
inlinestaticnoexcept

JSONをパースして、MpObjectを作成します。

引数
[out]objパース結果が格納されるMpObject
[in]strJSONが格納された文字列
[in]settingsパーサーの設定パラーメータ
[out]detailNULLでない場合、エラーが発生した箇所を示す文字列が格納されます。
戻り値
0ならば成功
説明
この関数を用いてmsgpackをパースすることはできません。 settings.formatには、JsonStreamParserSettings::kFormatJsonが指定されているものとして動作します。

JsonStreamParser.h130 行目に定義があります。

◆ Parse() [4/8]

nn::nlib::msgpack::JsonStreamParser::Parse ( JsonStreamParser parser,
bool  peek,
Detail detail 
)
staticnoexcept

JSON又はmsgpackをパースして、MpObjectを作成して返します。

引数
[in]parserパーサー
[in]peektrueならば、最初のトークンに既にNext()で取得済みのトークンを利用
[out]detailNULLでない場合、エラーが発生した箇所を示す文字列が格納されます。
戻り値
エラー値とunique_ptr<MpObject>のペア
説明
peekは、複数のJSONをパースする場合、2つめ以降からtrueを渡します。通常はfalseを渡してください。

◆ Parse() [5/8]

nn::nlib::msgpack::JsonStreamParser::Parse ( const nlib_byte_t first,
const nlib_byte_t last,
const JsonStreamParserSettings settings,
Detail detail 
)
staticnoexcept

msgpackをパースして、MpObjectを作成して返します。

引数
[in]firstmsgpackバイト列の開始場所へのポインタ
[in]lastmsgpackバイト列の終了場所へのポインタ
[in]settingsパーサーの設定パラーメータ
[out]detailNULLでない場合、エラーが発生した箇所を示す文字列が格納されます。
戻り値
エラー値とunique_ptr<MpObject>のペア

◆ Parse() [6/8]

nn::nlib::msgpack::JsonStreamParser::Parse ( const MpWalker walker,
const JsonStreamParserSettings settings,
Detail detail 
)
inlinestaticnoexcept

Parse(walker.GetPtr(), walker.GetPtr() + walker.GetSize(), settings, detail)を実行します。

引数
[in]walkerパースするmsgpackバイト列
[in]settingsパーサーの設定パラーメータ
[out]detailNULLでない場合、エラーが発生した箇所を示す文字列が格納されます。
戻り値
エラー値とunique_ptr<MpObject>のペア

JsonStreamParser.h179 行目に定義があります。

◆ Parse() [7/8]

nn::nlib::msgpack::JsonStreamParser::Parse ( const nlib_utf8_t str,
const JsonStreamParserSettings settings,
Detail detail 
)
inlinestaticnoexcept

JSONをパースして、MpObjectを作成して返します。

引数
[in]strパースするJSON文字列
[in]settingsパーサーの設定パラーメータ
[out]detailNULLでない場合、エラーが発生した箇所を示す文字列が格納されます。
戻り値
エラー値とunique_ptr<MpObject>のペア

JsonStreamParser.h197 行目に定義があります。

◆ Parse() [8/8]

nn::nlib::msgpack::JsonStreamParser::Parse ( const nlib_utf8_t str)
inlinestaticnoexcept

brief 上記関数の引数省略版で、settingsをデフォルト値で渡します。

JsonStreamParser.h215 行目に定義があります。

◆ Skip()

nn::nlib::msgpack::JsonStreamParser::Skip ( )
noexcept

値、配列全体、連想配列全体を1つ読み飛ばします。

戻り値
途中でエラーが発生した場合はfalseを返します。

◆ ToDouble() [1/2]

nn::nlib::msgpack::JsonStreamParser::ToDouble ( const Token token,
double *  number 
)
inlinestaticnoexcept

数値トークンをdoubleへキャストします。

引数
[in]tokenGetToken()で得られるトークンへの参照
[out]number変換先の数値へのポインタ
戻り値
0成功した場合
EINVALnumberNULLであるか、数値以外を変換しようとした場合
EDOMトークンの値が整数値で、9007199254740991LLより大きいか-9007199254740991LLより小さかった場合

JsonStreamParser.h500 行目に定義があります。

◆ ToDouble() [2/2]

nn::nlib::msgpack::JsonStreamParser::ToDouble ( const Token token)
inlinestaticnoexcept

数値トークンをdoubleへキャストします。

引数
[in]tokenGetToken()で得られるトークンへの参照
戻り値
エラー値とdouble型の値のペアを返します。エラー値については以下の場合があります。
  • 0の場合は成功で、secondにキャストされた値が設定されます。
  • EINVALの場合は、数値以外、又はDBL_MINより小さいかDBL_MAXより大きい値を変換しようとしていて、secondの値は無効です。
  • EDOMの場合は、トークンの値が整数値で、9007199254740991LLより大きいか-9007199254740991LLより小さかった場合で、secondにはキャストされた値が設定されます。
説明
以下がコードと実行結果の例になります。
const nlib_utf8_t* json = R"([123.4, "string", 9007199254740992, 1.8976931348623158e+308])";
MemoryInputStream stream(json, nlib_strlen(json));
SUCCEED_IF(parser.Init() == 0);
SUCCEED_IF(parser.Open(&stream) == 0);
SUCCEED_IF(parser.Next() == JsonStreamParser::kEventStartArray);
parser.Next();
auto r = JsonStreamParser::ToDouble(parser.GetToken());
nlib_printf("ToDouble: %s, %f\n", nlib_error_string(r.first), r.second);
parser.Next();
r = JsonStreamParser::ToDouble(parser.GetToken());
nlib_printf("ToDouble: %s, invalid\n", nlib_error_string(r.first));
parser.Next();
r = JsonStreamParser::ToDouble(parser.GetToken());
nlib_printf("ToDouble: %s, %f\n", nlib_error_string(r.first), r.second);
parser.Next();
r = JsonStreamParser::ToDouble(parser.GetToken());
nlib_printf("ToDouble: %s, %f\n", nlib_error_string(r.first), r.second);
parser.Close();
stream.Close();
/*
Output:
ToDouble: OK, 123.400000
ToDouble: EINVAL, invalid
ToDouble: EDOM, 9007199254740992.000000
ToDouble: EINVAL, 0.000000
*/

JsonStreamParser.h254 行目に定義があります。

◆ ToFloat() [1/2]

nn::nlib::msgpack::JsonStreamParser::ToFloat ( const Token token,
float *  number 
)
inlinestaticnoexcept

数値トークンをfloatへキャストします。

引数
[in]tokenGetToken()で得られるトークンへの参照
[out]number変換先の数値へのポインタ
戻り値
0成功した場合
EINVALnumberNULLであるか、数値以外を変換しようとした場合
ERANGE値がFLT_MAXより大きいかFLT_MINよりより小さかった場合
EDOMトークンの値が整数値で、1677215より大きいか-1677215より小さかった場合
説明
0, ERANGE又はEDOMが返り値の場合は、*numberにキャストされた値が格納されています。

JsonStreamParser.h466 行目に定義があります。

◆ ToFloat() [2/2]

nn::nlib::msgpack::JsonStreamParser::ToFloat ( const Token token)
inlinestaticnoexcept

数値トークンをfloatへキャストします。

引数
[in]tokenGetToken()で得られるトークンへの参照
戻り値
エラー値とfloat型の値のペアを返します。エラー値については以下の場合があります。
  • 0の場合は成功で、secondにキャストされた値が設定されます。
  • EINVALの場合は、数値以外、又はDBL_MINより小さいかDBL_MAXより大きい値を変換しようとしていて、secondの値は無効です。
  • ERANGEの場合は、値がFLT_MAXより大きいかFLT_MINよりより小さかった場合で、secondにはキャストされた値が設定されます。
  • EDOMの場合は、トークンの値が整数値で1677215より大きいか-1677215より小さかった場合か、double型の浮動小数点数をキャストしようとした場合で、secondにはキャストされた値が設定されます。
説明
以下がコードと実行結果の例になります。
const nlib_utf8_t* json = R"([123.4, "string", 1677216, 3.502823466e+38, 1.8976931348623158e+308])";
MemoryInputStream stream(json, nlib_strlen(json));
SUCCEED_IF(parser.Init() == 0);
SUCCEED_IF(parser.Open(&stream) == 0);
SUCCEED_IF(parser.Next() == JsonStreamParser::kEventStartArray);
parser.Next();
auto r = JsonStreamParser::ToFloat(parser.GetToken());
nlib_printf("ToFloat: %s, %f\n", nlib_error_string(r.first), r.second);
parser.Next();
r = JsonStreamParser::ToFloat(parser.GetToken());
nlib_printf("ToFloat: %s, invalid\n", nlib_error_string(r.first));
parser.Next();
r = JsonStreamParser::ToFloat(parser.GetToken());
nlib_printf("ToFloat: %s, %f\n", nlib_error_string(r.first), r.second);
parser.Next();
r = JsonStreamParser::ToFloat(parser.GetToken());
nlib_printf("ToFloat: %s, %f\n", nlib_error_string(r.first), r.second);
parser.Next();
r = JsonStreamParser::ToFloat(parser.GetToken());
nlib_printf("ToFloat: %s, %f\n", nlib_error_string(r.first), r.second);
parser.Close();
stream.Close();
/*
Output:
ToFloat: EDOM, 123.400002
ToFloat: EINVAL, invalid
ToFloat: OK, 1677216.000000
ToFloat: ERANGE, inf
ToFloat: EINVAL, 0.000000
*/
注意
JSONをパースする場合、数値はdouble型からfloat型に変換され、EDOMを返すことに注意してください。msgpackの場合はfloat 32をパースした場合であればこのエラーを返すことはありません。

JsonStreamParser.h249 行目に定義があります。

◆ ToInt32() [1/2]

nn::nlib::msgpack::JsonStreamParser::ToInt32 ( const Token token,
int32_t *  number 
)
inlinestaticnoexcept

数値トークンをint32_tへキャストします。

引数
[in]tokenGetToken()で得られるトークンへの参照
[out]number変換先の数値へのポインタ
戻り値
0成功した場合
EINVALnumberNULLであるか、数値以外を変換しようとした場合
ERANGE値がINT32_MAXより大きいか又はINT32_MINより小さかった場合
EDOM浮動小数点数を変換しようとした場合でERANGEを返さない場合
説明
0, ERANGE又はEDOMが返り値の場合は、*numberにキャストされた値が格納されています。

JsonStreamParser.h329 行目に定義があります。

◆ ToInt32() [2/2]

nn::nlib::msgpack::JsonStreamParser::ToInt32 ( const Token token)
inlinestaticnoexcept

数値トークンをint32_tへキャストします。

引数
[in]tokenGetToken()で得られるトークンへの参照
戻り値
エラー値とint32_t型の値のペアを返します。エラー値については以下の場合があります。
  • 0の場合は成功で、secondにキャストされた値が設定されます。
  • EINVALの場合は、数値以外を変換しようとしていて、secondの値は無効です。
  • ERANGEの場合は、値がINT32_MAXより大きいかINT32_MINより小さかった場合で、secondにはキャストされた値が設定されます。
  • EDOMの場合は、浮動小数点数を変換し、且つERANGEを返すケースに該当する場合ではなかった場合で、secondにはキャストされた値が設定されます。
説明
以下がコードと実行結果の例になります。
const nlib_utf8_t* json = R"([100, "string", 2147483648, 1.23456])";
MemoryInputStream stream(json, nlib_strlen(json));
SUCCEED_IF(parser.Init() == 0);
SUCCEED_IF(parser.Open(&stream) == 0);
SUCCEED_IF(parser.Next() == JsonStreamParser::kEventStartArray);
parser.Next();
auto r = JsonStreamParser::ToInt32(parser.GetToken());
nlib_printf("ToInt32: %s, %" PRId32 "\n", nlib_error_string(r.first), r.second);
parser.Next();
r = JsonStreamParser::ToInt32(parser.GetToken());
nlib_printf("ToInt32: %s, invalid\n", nlib_error_string(r.first));
parser.Next();
r = JsonStreamParser::ToInt32(parser.GetToken());
nlib_printf("ToInt32: %s, %" PRId32 "\n", nlib_error_string(r.first), r.second);
parser.Next();
r = JsonStreamParser::ToInt32(parser.GetToken());
nlib_printf("ToInt32: %s, %" PRId32 "\n", nlib_error_string(r.first), r.second);
parser.Close();
stream.Close();
/*
Output:
ToInt32: OK, 100
ToInt32: EINVAL, invalid
ToInt32: ERANGE, -2147483648
ToInt32: EDOM, 1
*/

JsonStreamParser.h229 行目に定義があります。

◆ ToInt64() [1/2]

nn::nlib::msgpack::JsonStreamParser::ToInt64 ( const Token token,
int64_t *  number 
)
inlinestaticnoexcept

数値トークンをint64_tへキャストします。

引数
[in]tokenGetToken()で得られるトークンへの参照
[out]number変換先の数値へのポインタ
戻り値
0成功した場合
EINVALnumberNULLであるか、数値以外を変換しようとした場合
ERANGE値がINT64_MAX又はINT64_MINより小さかった場合
EDOM浮動小数点数を変換しようとした場合でERANGEを返さない場合
説明
0, ERANGE又はEDOMが返り値の場合は、*numberにキャストされた値が格納されています。

JsonStreamParser.h399 行目に定義があります。

◆ ToInt64() [2/2]

nn::nlib::msgpack::JsonStreamParser::ToInt64 ( const Token token)
inlinestaticnoexcept

数値トークンをint64_tへキャストします。

引数
[in]tokenGetToken()で得られるトークンへの参照
戻り値
エラー値とint64_t型の値のペアを返します。エラー値については以下の場合があります。
  • 0の場合は成功で、secondにキャストされた値が設定されます。
  • EINVALの場合は、数値以外を変換しようとしていて、secondの値は無効です。
  • ERANGEの場合は、値がINT64_MAXより大きいかINT64_MINより小さかった場合で、secondにはキャストされた値が設定されます。
  • EDOMの場合は、浮動小数点数を変換し、且つERANGEを返すケースに該当する場合ではなかった場合で、secondにはキャストされた値が設定されます。
説明
以下がコードと実行結果の例になります。
const nlib_utf8_t* json = R"([100, "string", 9223372036854775808, 1.23456])";
MemoryInputStream stream(json, nlib_strlen(json));
SUCCEED_IF(parser.Init() == 0);
SUCCEED_IF(parser.Open(&stream) == 0);
SUCCEED_IF(parser.Next() == JsonStreamParser::kEventStartArray);
parser.Next();
auto r = JsonStreamParser::ToInt64(parser.GetToken());
nlib_printf("ToInt64: %s, %" PRId64 "\n", nlib_error_string(r.first), r.second);
parser.Next();
r = JsonStreamParser::ToInt64(parser.GetToken());
nlib_printf("ToInt64: %s, invalid\n", nlib_error_string(r.first));
parser.Next();
r = JsonStreamParser::ToInt64(parser.GetToken());
nlib_printf("ToInt64: %s, %" PRId64 "\n", nlib_error_string(r.first), r.second);
parser.Next();
r = JsonStreamParser::ToInt64(parser.GetToken());
nlib_printf("ToInt64: %s, %" PRId64 "\n", nlib_error_string(r.first), r.second);
parser.Close();
stream.Close();
/*
Output:
ToInt64: OK, 100
ToInt64: EINVAL, invalid
ToInt64: ERANGE, -9223372036854775808
ToInt64: EDOM, 1
*/

JsonStreamParser.h239 行目に定義があります。

◆ ToTimestamp() [1/2]

nn::nlib::msgpack::JsonStreamParser::ToTimestamp ( const Token token,
nlib_time t 
)
staticnoexcept

タイムスタンプをnlib_timeへ変換します。

引数
[in]tokenGetToken()で得られるトークンへの参照
[out]t変換先の時刻へのポインタ
戻り値
0成功した場合
EINVALtNULLであるか、タイムスタンプ以外を変換しようとした場合
ERANGE時刻がnlib_timeに格納できる範囲ではない場合

◆ ToTimestamp() [2/2]

nn::nlib::msgpack::JsonStreamParser::ToTimestamp ( const Token token)
inlinestaticnoexcept

タイムスタンプをnlib_timeへ変換します。msgpackのTimestamp extension typeをパースした場合のみに変換されます。

引数
[in]tokenGetToken()で得られるトークンへの参照
戻り値
エラー値とnlib_time型の値のペアを返します。エラー値については以下の場合があります。
  • 0の場合は成功で、secondにキャストされた値が設定されます。
  • EINVALの場合は、タイムスタンプ以外を変換しようとした場合で、secondの値は無効です。
  • ERANGEの場合は、時刻がnlib_timeに格納できる範囲ではない場合で、secondの値は無効です。

JsonStreamParser.h259 行目に定義があります。

◆ ToUint32() [1/2]

nn::nlib::msgpack::JsonStreamParser::ToUint32 ( const Token token,
uint32_t *  number 
)
inlinestaticnoexcept

数値トークンをuint32_tへキャストします。

引数
[in]tokenGetToken()で得られるトークンへの参照
[out]number変換先の数値へのポインタ
戻り値
0成功した場合
EINVALnumberNULLであるか、数値以外を変換しようとした場合
ERANGE値がUINT32_MAXより大きいか0より小さかった場合
EDOM浮動小数点数を変換しようとした場合でERANGEを返さない場合
説明
0, ERANGE又はEDOMが返り値の場合は、*numberにキャストされた値が格納されています。

JsonStreamParser.h365 行目に定義があります。

◆ ToUint32() [2/2]

nn::nlib::msgpack::JsonStreamParser::ToUint32 ( const Token token)
inlinestaticnoexcept

数値トークンをuint32_tへキャストします。

引数
[in]tokenGetToken()で得られるトークンへの参照
戻り値
エラー値とuint32_t型の値のペアを返します。エラー値については以下の場合があります。
  • 0の場合は成功で、secondにキャストされた値が設定されます。
  • EINVALの場合は、数値以外を変換しようとしていて、secondの値は無効です。
  • ERANGEの場合は、値がUINT32_MAXより大きいか0より小さかった場合で、secondにはキャストされた値が設定されます。
  • EDOMの場合は、浮動小数点数を変換し、且つERANGEを返すケースに該当する場合ではなかった場合で、secondにはキャストされた値が設定されます。
説明
以下がコードと実行結果の例になります。
const nlib_utf8_t* json = R"([100, "string", -1, 1.23456])";
MemoryInputStream stream(json, nlib_strlen(json));
SUCCEED_IF(parser.Init() == 0);
SUCCEED_IF(parser.Open(&stream) == 0);
SUCCEED_IF(parser.Next() == JsonStreamParser::kEventStartArray);
parser.Next();
auto r = JsonStreamParser::ToUint32(parser.GetToken());
nlib_printf("ToUint32: %s, %" PRIu32 "\n", nlib_error_string(r.first), r.second);
parser.Next();
r = JsonStreamParser::ToUint32(parser.GetToken());
nlib_printf("ToUint32: %s, invalid\n", nlib_error_string(r.first));
parser.Next();
r = JsonStreamParser::ToUint32(parser.GetToken());
nlib_printf("ToUint32: %s, %" PRIu32 "\n", nlib_error_string(r.first), r.second);
parser.Next();
r = JsonStreamParser::ToUint32(parser.GetToken());
nlib_printf("ToUint32: %s, %" PRIu32 "\n", nlib_error_string(r.first), r.second);
parser.Close();
stream.Close();
/*
Output:
ToUint32: OK, 100
ToUint32: EINVAL, invalid
ToUint32: ERANGE, -1
ToUint32: EDOM, 1
*/

JsonStreamParser.h234 行目に定義があります。

◆ ToUint64() [1/2]

nn::nlib::msgpack::JsonStreamParser::ToUint64 ( const Token token,
uint64_t *  number 
)
inlinestaticnoexcept

数値トークンをuint64_tへキャストします。

引数
[in]tokenGetToken()で得られるトークンへの参照
[out]number変換先の数値へのポインタ
戻り値
0成功した場合
EINVALnumberNULLであるか、数値以外を変換しようとした場合
ERANGE値がUINT64_MAXより大きいか0より小さかった場合
EDOM浮動小数点数を変換しようとした場合でERANGEを返さない場合
説明
0, ERANGE又はEDOMが返り値の場合は、*numberにキャストされた値が格納されています。

JsonStreamParser.h433 行目に定義があります。

◆ ToUint64() [2/2]

nn::nlib::msgpack::JsonStreamParser::ToUint64 ( const Token token)
inlinestaticnoexcept

数値トークンをuint64_tへキャストします。

引数
[in]tokenGetToken()で得られるトークンへの参照
戻り値
エラー値とuint64_t型の値のペアを返します。エラー値については以下の場合があります。
  • 0の場合は成功で、secondにキャストされた値が設定されます。
  • EINVALの場合は、数値以外を変換しようとしていて、secondの値は無効です。
  • ERANGEの場合は、値がUINT64_MAXより大きいか0より小さかった場合で、secondにはキャストされた値が設定されます。
  • EDOMの場合は、浮動小数点数を変換し、且つERANGEを返すケースに該当する場合ではなかった場合で、secondにはキャストされた値が設定されます。
説明
以下がコードと実行結果の例になります。
const nlib_utf8_t* json = R"([100, "string", -1, 1.23456])";
MemoryInputStream stream(json, nlib_strlen(json));
SUCCEED_IF(parser.Init() == 0);
SUCCEED_IF(parser.Open(&stream) == 0);
SUCCEED_IF(parser.Next() == JsonStreamParser::kEventStartArray);
parser.Next();
auto r = JsonStreamParser::ToUint64(parser.GetToken());
nlib_printf("ToUint64: %s, %" PRIu64 "\n", nlib_error_string(r.first), r.second);
parser.Next();
r = JsonStreamParser::ToUint64(parser.GetToken());
nlib_printf("ToUint64: %s, invalid\n", nlib_error_string(r.first));
parser.Next();
r = JsonStreamParser::ToUint64(parser.GetToken());
nlib_printf("ToUint64: %s, %" PRIu64 "\n", nlib_error_string(r.first), r.second);
parser.Next();
r = JsonStreamParser::ToUint64(parser.GetToken());
nlib_printf("ToUint64: %s, %" PRIu64 "\n", nlib_error_string(r.first), r.second);
parser.Close();
stream.Close();
/*
Output:
ToUint64: OK, 100
ToUint64: EINVAL, invalid
ToUint64: ERANGE, 18446744073709551615
ToUint64: EDOM, 1
*/

JsonStreamParser.h244 行目に定義があります。


このクラス詳解は次のファイルから抽出されました: