xpack
v1.0.6
英語
libbson-1.0
に依存します。自分でインストールする必要があります。完全にテストされていません。詳細については README を参照してください。libmysqlclient-dev
に依存します。これは自分でインストールする必要があります。完全にテストされていない# include < iostream >
# include " xpack/json.h " // Json包含这个头文件,xml则包含xpack/xml.h
using namespace std ;
struct User {
int id;
string name;
XPACK (O(id, name)); // 添加宏定义XPACK在结构体定义结尾
};
int main ( int argc, char *argv[]) {
User u;
string data = " { " id " :12345, " name " : " xpack " } " ;
xpack::json::decode (data, u); // json转结构体
cout<<u. id << ' ; ' <<u. name <<endl;
string json = xpack::json::encode (u); // 结构体转json
cout<<json<<endl;
return 0 ;
}
現在、次のコンテナー (std) がサポートされています。
マクロ XPACK では、XPACK(O(a,b)) のように変数を文字と一緒に含める必要があり、各文字に複数の変数を含めることができます。現在サポートされている文字は次のとおりです。
json:_id
は有効です。グローバル エイリアスは必要ありません。_id
は有効です。# include < iostream >
# include " xpack/json.h "
using namespace std ;
struct Test {
long uid;
string name;
XPACK (A(uid, " id " ), O(name)); // "uid"的别名是"id"
};
int main ( int argc, char *argv[]) {
Test t;
string json= " { " id " :123, " name " : " Pony " } " ;
xpack::json::decode (json, t);
cout<<t. uid <<endl;
return 0 ;
}
# include < iostream >
# include " xpack/json.h "
using namespace std ;
struct Test {
short ver: 8 ;
short len: 8 ;
string name;
XPACK (B(F( 0 ), ver, len), O(name));
};
int main ( int argc, char *argv[]) {
Test t;
string json= " { " ver " :4, " len " :20, " name " : " IPv4 " } " ;
xpack::json::decode (json, t);
cout<<t. ver <<endl;
cout<<t. len <<endl;
return 0 ;
}
# include < iostream >
# include " xpack/json.h "
using namespace std ;
struct P1 {
string mail;
XPACK (O(mail));
};
struct P2 {
long version;
XPACK (O(version));
};
struct Test : public P1 , public P2 {
long uid;
string name;
XPACK (I(P1, P2), O(uid, name));
};
int main ( int argc, char *argv[]) {
Test t;
string json= " { " mail " : " [email protected] " , " version " :2019, " id " :123, " name " : " Pony " } " ;
xpack::json::decode (json, t);
cout<<t. mail <<endl;
cout<<t. version <<endl;
return 0 ;
}
# include < iostream >
# include " xpack/json.h "
using namespace std ;
enum Enum {
X = 0 ,
Y = 1 ,
Z = 2 ,
};
struct Test {
string name;
Enum e;
XPACK (O(name), E(F( 0 ), e));
};
int main ( int argc, char *argv[]) {
Test t;
string json= " { " name " : " IPv4 " , " e " :1} " ;
xpack::json::decode (json, t);
cout<<t. name <<endl;
cout<<t. e <<endl;
return 0 ;
}
アプリケーションシナリオ
struct Time {
long ts; // unix timestamp
};
これを {"ts":1218196800} 形式にエンコードするのではなく、「2008-08-08 20:00:00」形式にエンコードしたいと考えています。
ここには 2 つの方法があります。
どちらのメソッドも基本的にエンコード/デコードを独自に実装しますが、次のような違いがあります。
これら 2 つの機能を使用すると、より柔軟なエンコードとデコードの制御を実現できます。たとえば、この例では、Sub.type==1 の場合は seq1 をエンコードし、そうでない場合は__x_pack_decode
と__x_pack_encode
をエンコードする関数を実装します。 XPACK マクロによって構造に追加されたデコード/エンコード関数、カスタム エンコード関数およびデコード関数は、これらの関数を通じて xpack のデフォルトのエンコード関数およびデコード関数を呼び出すことができます。
カスタム コーデックを使用してユニオンを処理できます。例を参照してください。
# include < iostream >
# include " xpack/json.h "
using namespace std ;
struct Test {
char name[ 64 ];
char email[ 64 ];
XPACK (O(name, email));
};
int main ( int argc, char *argv[]) {
Test t;
string json= " { " name " : " Pony " , " email " : " [email protected] " } " ;
xpack::json::decode (json, t);
cout<<t. name <<endl;
cout<<t. email <<endl;
return 0 ;
}
operator [](size_t index)
配列のインデックス要素 (0 から始まる) を取得するために使用されます。operator [](const char *key)
キーに基づいて Object 型の要素を取得するために使用されます。# include < sys/time.h >
# include < iostream >
# include " xpack/json.h "
using namespace std ;
/*
struct timeval {
time_t tv_sec;
suseconds_t tv_usec;
};
*/
// timeval is thirdparty struct
XPACK_OUT ( timeval , O(tv_sec, tv_usec));
struct T {
int a;
string b;
timeval t;
XPACK (O(a, b, t));
};
int main ( int argc, char *argv[]) {
T t;
T r;
t. a = 123 ;
t. b = " xpack " ;
t. t . tv_sec = 888 ;
t. t . tv_usec = 999 ;
string s = xpack::json::encode (t);
cout<<s<<endl;
xpack::json::decode (s, r);
cout<<r. a << ' , ' <<r. b << ' , ' <<r. t . tv_sec << ' , ' <<r. t . tv_usec <<endl;
return 0 ;
}
< ids >
< ids >1</ ids >
< ids >2</ ids >
< ids >3</ ids >
</ ids >
< ids >
< id >1</ id >
< id >2</ id >
< id >3</ id >
</ ids >
< ids >1</ ids >
< ids >2</ ids >
< ids >3</ ids >
<data>hello</data>
も正常に解析できます。 static void decode(MYSQL_RES *result, T &val)
static void decode(MYSQL_RES *result, const std::string&field, T &val)