acl/lib_acl_cpp/include/acl_cpp/stdlib/json.hpp

779 lines
29 KiB
C++
Raw Normal View History

#pragma once
2017-06-02 14:47:24 +08:00
#include "../acl_cpp_define.hpp"
2014-11-19 00:25:21 +08:00
#include <list>
#include <vector>
2017-06-02 14:47:24 +08:00
#include "dbuf_pool.hpp"
#include "pipe_stream.hpp"
2014-11-19 00:25:21 +08:00
struct ACL_JSON_NODE;
struct ACL_JSON;
struct ACL_ITER;
/**
* ACL json 便 C++ 使
* 使使 ACL
* json ACL json
*
2014-11-19 00:25:21 +08:00
*/
namespace acl {
class string;
class json;
/**
* json json.create_node()
2014-11-19 00:25:21 +08:00
*/
class ACL_CPP_API json_node : public dbuf_obj
2014-11-19 00:25:21 +08:00
{
public:
/**
* json
* @return {const char*} json
*
2014-11-19 00:25:21 +08:00
*/
const char* tag_name(void) const;
/**
* json
*
* @return {const char*}
2014-11-19 00:25:21 +08:00
*/
const char* get_text(void) const;
/**
* json json json
* @param {const json_node*} NULL
* get_text get_obj NULL
2014-11-19 00:25:21 +08:00
*/
json_node* get_obj(void) const;
/**
* json
* @return {const char*} NULL
2015-10-20 21:07:23 +08:00
*/
const char* get_string(void) const;
/**
* json
* @return {const long long int*} NULL
2015-10-20 21:07:23 +08:00
*/
#if defined(_WIN32) || defined(_WIN64)
const __int64* get_int64(void) const;
#else
const long long int* get_int64(void) const;
#endif
/**
* json
* @return {const double*} NULL
*/
const double *get_double(void) const;
2015-10-20 21:07:23 +08:00
/**
* json
* @return {bool*} NULL
2015-10-20 21:07:23 +08:00
*/
const bool* get_bool(void) const;
/**
*
2015-10-20 21:07:23 +08:00
* @return {bool}
*/
bool is_string(void) const;
/**
*
2015-10-20 21:07:23 +08:00
* @return {bool}
*/
bool is_number(void) const;
/**
*
* @return {bool}
*/
bool is_double(void) const;
2015-10-20 21:07:23 +08:00
/**
*
2015-10-20 21:07:23 +08:00
* @return {bool}
*/
bool is_bool(void) const;
/**
* null
2015-10-20 21:07:23 +08:00
* @return {bool}
*/
bool is_null(void) const;
/**
*
2015-10-20 21:07:23 +08:00
* @return {bool}
*/
bool is_object(void) const;
/**
*
2015-10-20 21:07:23 +08:00
* @return {bool}
*/
bool is_array(void) const;
/**
*
2015-10-20 21:07:23 +08:00
* @return {const char*}
*/
const char* get_type(void) const;
/**
* json
* @param name {const char*}
* @return {bool} false
2014-11-19 00:25:21 +08:00
*/
bool set_tag(const char* name);
/**
* json
* @param text {const char*}
* @return {bool} false
2014-11-19 00:25:21 +08:00
*/
bool set_text(const char* text);
/**
* json json ( json )
* @param out {string*} 使使
2014-11-19 00:25:21 +08:00
* @return {const char*}
*/
const string& to_string(string* out = NULL) const;
2014-11-19 00:25:21 +08:00
2015-11-09 22:11:21 +08:00
/////////////////////////////////////////////////////////////////////
2014-11-19 00:25:21 +08:00
/**
* json json_node
* @param child {json_node*}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
2014-11-19 00:25:21 +08:00
*/
json_node& add_child(json_node* child, bool return_child = false);
/**
* json json_node
* @param child {json_node&}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
2014-11-19 00:25:21 +08:00
*/
json_node& add_child(json_node& child, bool return_child = false);
/**
* json json
* @param as_array {bool}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
2014-11-19 00:25:21 +08:00
*/
json_node& add_array(bool return_child = false);
2015-11-09 22:11:21 +08:00
json_node& add_child(bool as_array = false, bool return_child = false);
/**
* json json
* @param tag {const char*}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
2015-11-09 22:11:21 +08:00
*/
json_node& add_child(const char* tag, bool return_child = false);
/**
* json json
* @param tag {const char*}
* @param node {json_node*}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
2015-11-09 22:11:21 +08:00
*/
json_node& add_child(const char* tag, json_node* node,
bool return_child = false);
/**
* json json
* @param tag {const char*}
* @param node {json_node&}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
2015-11-09 22:11:21 +08:00
*/
json_node& add_child(const char* tag, json_node& node,
2015-10-20 21:07:23 +08:00
bool return_child = false);
2014-11-19 00:25:21 +08:00
/**
* json json
* @param tag {const char*}
* @param value {const char*}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
* add_text add_child
2014-11-19 00:25:21 +08:00
*/
json_node& add_text(const char* tag, const char* value,
bool return_child = false);
/**
* int64 json json
* @param tag {const char*}
* @param value {int64}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
2014-11-19 00:25:21 +08:00
*/
#if defined(_WIN32) || defined(_WIN64)
2014-11-19 00:25:21 +08:00
json_node& add_number(const char* tag, __int64 value,
bool return_child = false);
#else
json_node& add_number(const char* tag, long long int value,
bool return_child = false);
#endif
/**
* double json json
* @param tag {const char*}
* @param value {double}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
*/
json_node& add_double(const char* tag, double value,
bool return_child = false);
2014-11-19 00:25:21 +08:00
/**
* json json
* @param tag {const char*}
* @param value {bool}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
2014-11-19 00:25:21 +08:00
*/
json_node& add_bool(const char* tag, bool value,
bool return_child = false);
/**
* null json json
* @param tag {const char*}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
*/
json_node& add_null(const char* tag, bool return_child = false);
2014-11-19 00:25:21 +08:00
/**
* json json
* @param text {const char*}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
2014-11-19 00:25:21 +08:00
*/
2015-10-20 21:07:23 +08:00
json_node& add_array_text(const char* text,
bool return_child = false);
2014-11-19 00:25:21 +08:00
/**
* json json
* @param value {acl_int64}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
2014-11-19 00:25:21 +08:00
*/
#if defined(_WIN32) || defined(_WIN64)
2015-10-20 21:07:23 +08:00
json_node& add_array_number(__int64 value,
bool return_child = false);
2014-11-19 00:25:21 +08:00
#else
2015-10-20 21:07:23 +08:00
json_node& add_array_number(long long int value,
bool return_child = false);
2014-11-19 00:25:21 +08:00
#endif
/**
* json double json
* @param value {double}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
*/
json_node& add_array_double(double value, bool return_child = false);
2014-11-19 00:25:21 +08:00
/**
* json json
* @param value {bool}
* @param return_child {bool}
* @return {json_node&} return_child true
* json
2014-11-19 00:25:21 +08:00
*/
json_node& add_array_bool(bool value, bool return_child = false);
/**
* json null json
* @param return_child {bool}
* @return {json_node&} return_child true
* json
*/
json_node& add_array_null(bool return_child = false);
2014-11-19 00:25:21 +08:00
/**
* @return {json_node&} json
*
2014-11-19 00:25:21 +08:00
*/
json_node& get_parent(void) const;
2015-11-09 22:11:21 +08:00
/////////////////////////////////////////////////////////////////////
2014-11-19 00:25:21 +08:00
/**
*
* @return {json_node*}
* delete
2014-11-19 00:25:21 +08:00
*/
json_node* first_child(void);
/**
*
* @return {json_node*}
* delete
2014-11-19 00:25:21 +08:00
*/
json_node* next_child(void);
/**
* json json
* @param tag {const char*} json
* @return {json_node*} NULL
*/
json_node* operator[] (const char* tag);
2014-11-19 00:25:21 +08:00
/**
* json json
2014-11-19 00:25:21 +08:00
* @return {int}
*/
int depth(void) const;
/**
* json
* @return {int} >= 0
2014-11-19 00:25:21 +08:00
*/
int children_count(void) const;
/**
* json json
* @return {int}
*/
int detach(void);
/**
* json json_node
* first_child,
* next_child json_node
* 访
*/
2015-10-20 21:07:23 +08:00
void clear(void);
2014-11-19 00:25:21 +08:00
/**
* json
2014-11-19 00:25:21 +08:00
* @return {json&}
*/
json& get_json(void) const;
/**
* ACL json
* @return {ACL_JSON_NODE*}
2014-11-19 00:25:21 +08:00
*/
2015-10-20 21:07:23 +08:00
ACL_JSON_NODE* get_json_node(void) const;
2014-11-19 00:25:21 +08:00
private:
friend class json;
/**
* json
* @param node {ACL_JSON_NODE*} ACL ACL_JSON_NODE
2014-11-19 00:25:21 +08:00
*/
json_node(ACL_JSON_NODE* node, json* json_ptr);
/**
*
2014-11-19 00:25:21 +08:00
*/
~json_node(void);
/**
* json
2014-11-19 00:25:21 +08:00
* @param node {ACL_JSON_NODE*}
*/
void set_json_node(ACL_JSON_NODE* node);
private:
ACL_JSON_NODE* node_me_;
json* json_;
json_node* parent_;
json_node* parent_saved_;
std::vector<json_node*>* children_;
2014-11-19 00:25:21 +08:00
ACL_ITER* iter_;
string* buf_;
json_node* obj_;
2015-10-20 21:07:23 +08:00
union
{
#if defined(_WIN32) || defined(_WIN64)
__int64 n;
#else
long long int n;
#endif
bool b;
double d;
2015-10-20 21:07:23 +08:00
} node_val_;
void prepare_iter(void);
2014-11-19 00:25:21 +08:00
};
class ACL_CPP_API json : public pipe_stream, public dbuf_obj
2014-11-19 00:25:21 +08:00
{
public:
/**
* json json
* @param data {const char*} json
* json json
* json update
* update json
* data update
2014-11-19 00:25:21 +08:00
*/
json(const char* data = NULL);
/**
* json json json
* @param node {const json_node&} json json
2014-11-19 00:25:21 +08:00
*/
json(const json_node& node);
~json(void);
/**
*
2014-11-19 00:25:21 +08:00
* @param on {bool}
* @return {json&}
*/
json& part_word(bool on);
/**
* json
* json 使 json json
* json reset()
*
* @param data {const char*} json
@return {const char*}
2014-11-19 00:25:21 +08:00
*/
const char* update(const char* data);
/**
*
* @return {bool}
*/
2015-10-20 21:07:23 +08:00
bool finish(void);
2014-11-19 00:25:21 +08:00
/**
* json json json
* 使 json
* json
2014-11-19 00:25:21 +08:00
*/
void reset(void);
/**
* json
* @param tag {const char*} ()
* @return {json_node*} json NULL
* json_node
* clear/getElementsByTagName/getElementsByTags
*
2015-10-20 21:07:23 +08:00
*/
json_node* getFirstElementByTagName(const char* tag) const;
/**
*
* @param tag {const char*} ()
* @return {json_node*} json NULL
* json_node
* clear/getElementsByTagName/getElementsByTags
*
2015-10-20 21:07:23 +08:00
*/
json_node* operator[](const char* tag) const;
/**
* json
* @param tag {const char*} ()
* @return {const std::vector<json_node*>&}
* empty() == true
* json_node
* clear/getElementsByTagName/getElementsByTags
*
2014-11-19 00:25:21 +08:00
*/
2015-10-20 21:07:23 +08:00
const std::vector<json_node*>&
getElementsByTagName(const char* tag) const;
2014-11-19 00:25:21 +08:00
/**
* json json
* @param tags {const char*} '/'
* json
2014-11-19 00:25:21 +08:00
* { 'root': [
* 'first': { 'second': { 'third': 'test1' } },
* 'first': { 'second': { 'third': 'test2' } },
* 'first': { 'second': { 'third': 'test3' } }
* ]
* }
* root/first/second/third
*
* @return {const std::vector<json_node*>&} json ,
* empty() == true
* json_node
* clear/getElementsByTagName/getElementsByTags
*
2014-11-19 00:25:21 +08:00
*/
2015-10-20 21:07:23 +08:00
const std::vector<json_node*>&
getElementsByTags(const char* tags) const;
2014-11-19 00:25:21 +08:00
/**
* json json
* @param tags {const char*} '/'
* json
* { 'root': [
* 'first': { 'second': { 'third': 'test1' } },
* 'first': { 'second': { 'third': 'test2' } },
* 'first': { 'second': { 'third': 'test3' } }
* ]
* }
* root/first/second/third
*
* @return {json_node*} NULL
*/
json_node* getFirstElementByTags(const char* tags) const;
2014-11-19 00:25:21 +08:00
/**
* acl ACL_JSON
* @return {ACL_JSON*}
*
2014-11-19 00:25:21 +08:00
*/
ACL_JSON* get_json(void) const;
2015-11-09 22:11:21 +08:00
/////////////////////////////////////////////////////////////////////
2014-11-19 00:25:21 +08:00
/**
* json_node
2014-11-19 00:25:21 +08:00
* "tag_name": "tag_value"
* @param tag {const char*}
* @param value {const char*}
* @return {json_node&} json_node
* json
* reset json_node
2014-11-19 00:25:21 +08:00
*/
json_node& create_node(const char* tag, const char* value);
/**
* json_node
2014-11-19 00:25:21 +08:00
* "tag_name": tag_value
* @param tag {const char*}
* @param value {int64}
* @return {json_node&} json_node
* json
* reset json_node
2014-11-19 00:25:21 +08:00
*/
#if defined(_WIN32) || defined(_WIN64)
2014-11-19 00:25:21 +08:00
json_node& create_node(const char* tag, __int64 value);
#else
json_node& create_node(const char* tag, long long int value);
#endif
/**
* json_node
* "tag_name": tag_value
* @param tag {const char*}
* @param value {double}
* @return {json_node&} json_node
* json
* reset json_node
*/
json_node& create_double(const char* tag, double value);
2014-11-19 00:25:21 +08:00
/**
* json_node
2014-11-19 00:25:21 +08:00
* "tag_name": true|false
* @param tag {const char*}
* @param value {bool}
* @return {json_node&} json_node
* json
* reset json_node
2014-11-19 00:25:21 +08:00
*/
json_node& create_node(const char* tag, bool value);
/**
* json_node null
* "tag_name": null
* @param tag {const char*}
* @return {json_node&} json_node
* json
* reset json_node
*/
json_node& create_null(const char* tag);
2014-11-19 00:25:21 +08:00
/**
* json_node "string"
* json
* @param text {const char*}
* @return {json_node&} json_node
* json
* reset json_node
2014-11-19 00:25:21 +08:00
*/
json_node& create_array_text(const char* text);
/**
* json_node
* json
* @param value {acl_int64}
* @return {json_node&} json_node
* json
* reset json_node
2014-11-19 00:25:21 +08:00
*/
#if defined(_WIN32) || defined(_WIN64)
2014-11-19 00:25:21 +08:00
json_node& create_array_number(__int64 value);
#else
json_node& create_array_number(long long int value);
#endif
/**
* json_node
* json
* @param value {double}
* @return {json_node&} json_node
* json
* reset json_node
*/
json_node& create_array_double(double value);
2014-11-19 00:25:21 +08:00
/**
* json_node
* json
* @param value {bool}
* @return {json_node&} json_node
* json
* reset json_node
2014-11-19 00:25:21 +08:00
*/
json_node& create_array_bool(bool value);
/**
* json_node null
* json
* @return {json_node&} json_node
* json
* reset json_node
*/
json_node& create_array_null(void);
2014-11-19 00:25:21 +08:00
/**
* json_node ,
* "{}" "[]"
* @param as_array {bool}
* @return {json_node&} json_node
* json
* reset json_node
2014-11-19 00:25:21 +08:00
*/
json_node& create_node(bool as_array = false);
2015-10-20 21:07:23 +08:00
json_node& create_array(void);
2014-11-19 00:25:21 +08:00
/**
* json_node tag_name: {}
* tag_name: []
* @param tag {const char*}
* @param node {json_node*} json
* @return {json_node&} json_node
* json
* reset json_node
2014-11-19 00:25:21 +08:00
*/
json_node& create_node(const char* tag, json_node* node);
/**
* json_node tag_name: {}
* tag_name: []
* @param tag {const char*}
* @param node {json_node&} json
* @return {json_node&} json_node
* json
* reset json_node
2014-11-19 00:25:21 +08:00
*/
json_node& create_node(const char* tag, json_node& node);
2015-11-09 22:11:21 +08:00
/////////////////////////////////////////////////////////////////////
2014-11-19 00:25:21 +08:00
/**
* json json json
* json json
* @param node {json_node*} json json
* @return {json_node&} json json
2014-11-19 00:25:21 +08:00
*/
json_node& duplicate_node(const json_node* node);
/**
* json json json
* json json
* @param node {json_node&} json json
* @return {json_node&} json json
2014-11-19 00:25:21 +08:00
*/
json_node& duplicate_node(const json_node& node);
/**
*
2014-11-19 00:25:21 +08:00
* @return {json_node&}
*/
2015-10-20 21:07:23 +08:00
json_node& get_root(void);
2014-11-19 00:25:21 +08:00
/**
* json
* @return {json_node*} json
*
*
2014-11-19 00:25:21 +08:00
*/
json_node* first_node(void);
/**
* json json
* @return {json_node*}
*
*
2014-11-19 00:25:21 +08:00
*/
json_node* next_node(void);
/**
* json
* @param out {string&}
* @param add_space {bool} json
2014-11-19 00:25:21 +08:00
*/
void build_json(string& out, bool add_space = false) const;
2014-11-19 00:25:21 +08:00
/**
* json json
* @param out {string*} 使使
* @param add_space {bool} json
2014-11-19 00:25:21 +08:00
* @return {const string&}
*/
const string& to_string(string* out = NULL, bool add_space = false) const;
2014-11-19 00:25:21 +08:00
// pipe_stream 虚函数重载
2014-11-19 00:25:21 +08:00
virtual int push_pop(const char* in, size_t len,
string* out, size_t max = 0);
virtual int pop_end(string* out, size_t max = 0);
virtual void clear(void);
2014-11-19 00:25:21 +08:00
private:
// 对应于 acl 库中的 ACL_JSON 对象
2014-11-19 00:25:21 +08:00
ACL_JSON *json_;
// json 对象树中的根节点对象
2014-11-19 00:25:21 +08:00
json_node* root_;
// 临时的 json 节点查询结果集
std::vector<json_node*> nodes_query_;
// 由该 json 容器分配的 json 节点集合
std::list<json_node*> nodes_tmp_;
// 缓冲区
2014-11-19 00:25:21 +08:00
string* buf_;
ACL_ITER* iter_;
};
} // namespace acl