xpack
v1.0.6
영어
libbson-1.0
에 따라 bson을 지원하며 직접 설치해야 합니다. 완전히 테스트되지 않았습니다 . 자세한 내용은 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))와 같이 문자와 함께 포함되어야 합니다. XPACK은 여러 문자를 포함할 수 있으며 각 문자는 여러 변수를 포함할 수 있습니다. 현재 지원되는 문자는 다음과 같습니다.
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" 형식으로 인코딩하고 싶습니다.
여기에는 두 가지 방법이 있습니다.
두 방법 모두 본질적으로 자체적으로 인코딩/디코딩을 구현하지만 다음과 같은 차이점이 있습니다.
이 두 가지 기능을 사용하면 좀 더 유연한 인코딩 및 디코딩 제어를 구현할 수 있습니다. 예를 들어, 이 예에서는 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)