From 855c3cbbd860e34182012c6e836ea83fb1a30682 Mon Sep 17 00:00:00 2001 From: zhengshuxin Date: Mon, 3 Jul 2023 11:18:03 +0800 Subject: [PATCH 1/2] Add json_node remove API for json object. --- lib_acl_cpp/include/acl_cpp/stdlib/json.hpp | 24 ++++++++++++++------- lib_acl_cpp/src/stdlib/json.cpp | 14 ++++++++++-- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/lib_acl_cpp/include/acl_cpp/stdlib/json.hpp b/lib_acl_cpp/include/acl_cpp/stdlib/json.hpp index 85f8ac3db..4adddb12e 100644 --- a/lib_acl_cpp/include/acl_cpp/stdlib/json.hpp +++ b/lib_acl_cpp/include/acl_cpp/stdlib/json.hpp @@ -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& - getElementsByTagName(const char* tag) const; + const std::vector& getElementsByTagName(const char* tag) const; /** * 从 json 对象中获得所有的与给定多级标签名相同的 json 节点的集合 @@ -541,8 +540,7 @@ public: * 当调用方法 clear/getElementsByTagName/getElementsByTags 后,节点 * 不能再被引用,因为节点的内存被自动释放 */ - const std::vector& - getElementsByTags(const char* tags) const; + const std::vector& 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&} diff --git a/lib_acl_cpp/src/stdlib/json.cpp b/lib_acl_cpp/src/stdlib/json.cpp index 1bc886af5..b7ce309db 100644 --- a/lib_acl_cpp/src/stdlib/json.cpp +++ b/lib_acl_cpp/src/stdlib/json.cpp @@ -533,7 +533,7 @@ const std::vector& json::getElementsByTagName(const char* tag) const acl_foreach(iter, a) { ACL_JSON_NODE *tmp = (ACL_JSON_NODE*) iter.data; json_node* node = dbuf_->create - (tmp, const_cast(this)); + (tmp, const_cast(this)); const_cast(this)->nodes_query_.push_back(node); } @@ -554,7 +554,7 @@ const std::vector& json::getElementsByTags(const char* tags) const acl_foreach(iter, a) { ACL_JSON_NODE *tmp = (ACL_JSON_NODE*) iter.data; json_node* node = dbuf_->create - (tmp, const_cast(this)); + (tmp, const_cast(this)); const_cast(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_, From c3980105f47256601e84c829d05437311cba4f9b Mon Sep 17 00:00:00 2001 From: zhengshuxin Date: Mon, 3 Jul 2023 12:35:25 +0800 Subject: [PATCH 2/2] Removed the '\r\n' appended in json serialize. --- lib_acl_cpp/include/acl_cpp/serialize/serialize.hpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/lib_acl_cpp/include/acl_cpp/serialize/serialize.hpp b/lib_acl_cpp/include/acl_cpp/serialize/serialize.hpp index ba5c3beca..40d3028e3 100644 --- a/lib_acl_cpp/include/acl_cpp/serialize/serialize.hpp +++ b/lib_acl_cpp/include/acl_cpp/serialize/serialize.hpp @@ -4,12 +4,10 @@ #include "../stdlib/json.hpp" #include -namespace acl -{ +namespace acl { template -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 -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