mirror of
https://gitee.com/acl-dev/acl.git
synced 2024-12-14 00:40:55 +08:00
Merge branch 'gitee-master' into gitlab-upstream
This commit is contained in:
commit
6610af52fd
@ -4,12 +4,10 @@
|
||||
#include "../stdlib/json.hpp"
|
||||
#include <string>
|
||||
|
||||
namespace acl
|
||||
{
|
||||
namespace acl {
|
||||
|
||||
template<typename T>
|
||||
bool deserialize(json& j, T& o, string* err = NULL)
|
||||
{
|
||||
bool deserialize(json& j, T& o, string* err = NULL) {
|
||||
if (!j.finish())
|
||||
{
|
||||
if (err)
|
||||
@ -30,12 +28,10 @@ bool deserialize(json& j, T& o, string* err = NULL)
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
void serialize(T& o, string& buf)
|
||||
{
|
||||
void serialize(T& o, string& buf) {
|
||||
json j;
|
||||
json_node& n = gson(j, o);
|
||||
(void) n.to_string(&buf);
|
||||
buf += "\r\n";
|
||||
}
|
||||
|
||||
} // namespace acl
|
||||
|
@ -14,6 +14,8 @@ struct ACL_ITER;
|
||||
* 可以直接使用该类,如果在服务端执行且非常注重性能,建议直接使用 ACL 库的
|
||||
* json 解析器,因为该类也是调用了 ACL 库中的 json 解析过程,并且有二次拷贝
|
||||
* 过程,可能会稍微影响一些性能,但对于一般的应用这点影响是微不足道的
|
||||
* 整个 json 对象及其附属 json 节点对象均是构建内部的 dbuf 对象上, 所以其内部
|
||||
* 创建的 json 节点对象均会在 json 对象析构时一起释放.
|
||||
*/
|
||||
|
||||
namespace acl {
|
||||
@ -24,8 +26,7 @@ class json;
|
||||
/**
|
||||
* json 节点,该类对象必须以 json.create_node() 方式创建
|
||||
*/
|
||||
class ACL_CPP_API json_node : public dbuf_obj
|
||||
{
|
||||
class ACL_CPP_API json_node : public dbuf_obj {
|
||||
public:
|
||||
/**
|
||||
* 取得本 json 节点的标签名
|
||||
@ -436,8 +437,7 @@ private:
|
||||
} node_val_;
|
||||
};
|
||||
|
||||
class ACL_CPP_API json : public pipe_stream, public dbuf_obj
|
||||
{
|
||||
class ACL_CPP_API json : public pipe_stream, public dbuf_obj {
|
||||
public:
|
||||
/**
|
||||
* 构造函数,可用于解析 json 字符串或生成 json 对象
|
||||
@ -520,8 +520,7 @@ public:
|
||||
* 当调用方法 clear/getElementsByTagName/getElementsByTags 后,节点
|
||||
* 不能再被引用,因为节点的内存被自动释放
|
||||
*/
|
||||
const std::vector<json_node*>&
|
||||
getElementsByTagName(const char* tag) const;
|
||||
const std::vector<json_node*>& getElementsByTagName(const char* tag) const;
|
||||
|
||||
/**
|
||||
* 从 json 对象中获得所有的与给定多级标签名相同的 json 节点的集合
|
||||
@ -541,8 +540,7 @@ public:
|
||||
* 当调用方法 clear/getElementsByTagName/getElementsByTags 后,节点
|
||||
* 不能再被引用,因为节点的内存被自动释放
|
||||
*/
|
||||
const std::vector<json_node*>&
|
||||
getElementsByTags(const char* tags) const;
|
||||
const std::vector<json_node*>& getElementsByTags(const char* tags) const;
|
||||
|
||||
/**
|
||||
* 从 json 对象中获得所有的与给定多级标签名相同的 json 节点的集合
|
||||
@ -714,6 +712,14 @@ public:
|
||||
*/
|
||||
json_node& create_node(const char* tag, json_node& node);
|
||||
|
||||
/**
|
||||
* 将指定的 json 节点从 json 对象中删除, 同时释放其内存资源, 调用本函数
|
||||
* 后应用将不得再使用该 json 节点对象.
|
||||
* @param node {json_node*} 该 json 节点及其包含的子节点将会从 json 对
|
||||
* 象中删除, 其所占用的内存资源将会在 json 对象析构时随 dbuf 销毁.
|
||||
*/
|
||||
void remove(json_node* node);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
@ -732,6 +738,8 @@ public:
|
||||
*/
|
||||
json_node& duplicate_node(const json_node& node);
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
/**
|
||||
* 获得根节点对象
|
||||
* @return {json_node&}
|
||||
|
@ -533,7 +533,7 @@ const std::vector<json_node*>& json::getElementsByTagName(const char* tag) const
|
||||
acl_foreach(iter, a) {
|
||||
ACL_JSON_NODE *tmp = (ACL_JSON_NODE*) iter.data;
|
||||
json_node* node = dbuf_->create<json_node>
|
||||
(tmp, const_cast<json*>(this));
|
||||
(tmp, const_cast<json*>(this));
|
||||
const_cast<json*>(this)->nodes_query_.push_back(node);
|
||||
}
|
||||
|
||||
@ -554,7 +554,7 @@ const std::vector<json_node*>& json::getElementsByTags(const char* tags) const
|
||||
acl_foreach(iter, a) {
|
||||
ACL_JSON_NODE *tmp = (ACL_JSON_NODE*) iter.data;
|
||||
json_node* node = dbuf_->create<json_node>
|
||||
(tmp, const_cast<json*>(this));
|
||||
(tmp, const_cast<json*>(this));
|
||||
const_cast<json*>(this)->nodes_query_.push_back(node);
|
||||
}
|
||||
|
||||
@ -690,6 +690,16 @@ json_node& json::create_node(const char* tag, json_node& node)
|
||||
return *n;
|
||||
}
|
||||
|
||||
void json::remove(json_node* node)
|
||||
{
|
||||
if (node) {
|
||||
ACL_JSON_NODE* n = node->get_json_node();
|
||||
if (n) {
|
||||
acl_json_node_delete(n);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
json_node& json::duplicate_node(const json_node* node)
|
||||
{
|
||||
ACL_JSON_NODE* tmp = acl_json_node_duplicate(json_,
|
||||
|
Loading…
Reference in New Issue
Block a user