From f0a0b5dc093a9b909dc5b7b5b0c0524dccc83cdc Mon Sep 17 00:00:00 2001 From: bjd Date: Mon, 12 May 2025 19:37:09 +0800 Subject: [PATCH 1/4] =?UTF-8?q?json=E6=94=B9=E4=B8=BAcjson?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: bjd --- bundle.json | 2 +- .../adapter/communicator/BUILD.gn | 2 +- .../adapter/communicator/test/BUILD.gn | 2 +- services/distributeddataservice/app/BUILD.gn | 2 +- .../distributeddataservice/app/test/BUILD.gn | 4 +- .../fuzztest/dataservicestub_fuzzer/BUILD.gn | 1 - .../distributeddataservice/framework/BUILD.gn | 2 +- .../framework/include/cloud/subscription.h | 6 + .../include/serializable/serializable.h | 113 ++- .../framework/serializable/serializable.cpp | 731 +++++++++++++++++- .../framework/test/BUILD.gn | 10 +- .../framework/test/cloud_test.cpp | 7 +- .../framework/test/meta_data_test.cpp | 2 +- .../framework/test/serializable_test.cpp | 6 +- .../rust/extension/BUILD.gn | 2 +- .../service/backup/BUILD.gn | 2 +- .../service/bootstrap/BUILD.gn | 2 +- .../service/cloud/BUILD.gn | 2 +- .../service/config/BUILD.gn | 2 +- .../config/src/model/component_config.cpp | 2 +- .../service/data_share/BUILD.gn | 2 +- .../service/dumper/BUILD.gn | 2 +- .../service/kvdb/BUILD.gn | 2 +- .../service/matrix/BUILD.gn | 2 +- .../service/permission/BUILD.gn | 2 +- .../service/test/BUILD.gn | 27 +- .../fuzztest/cloudservicestub_fuzzer/BUILD.gn | 1 - .../datashareservicestub_fuzzer/BUILD.gn | 1 - .../test/fuzztest/dumphelper_fuzzer/BUILD.gn | 1 - .../fuzztest/kvdbservicestub_fuzzer/BUILD.gn | 1 - .../objectservicestub_fuzzer/BUILD.gn | 3 +- .../fuzztest/rdbresultsetstub_fuzzer/BUILD.gn | 1 - .../fuzztest/rdbservicestub_fuzzer/BUILD.gn | 1 - 33 files changed, 874 insertions(+), 74 deletions(-) diff --git a/bundle.json b/bundle.json index e80707c82..eb78c8cf7 100644 --- a/bundle.json +++ b/bundle.json @@ -92,7 +92,7 @@ "app_file_service", "file_api", "openssl", - "json", + "cJSON", "dmsfwk", "data_object", "init" diff --git a/services/distributeddataservice/adapter/communicator/BUILD.gn b/services/distributeddataservice/adapter/communicator/BUILD.gn index ff2d7cf86..4773e7fef 100755 --- a/services/distributeddataservice/adapter/communicator/BUILD.gn +++ b/services/distributeddataservice/adapter/communicator/BUILD.gn @@ -63,7 +63,7 @@ ohos_source_set("distributeddata_communicator") { "dsoftbus:softbus_client", "hilog:libhilog", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", "kv_store:distributeddb", ] diff --git a/services/distributeddataservice/adapter/communicator/test/BUILD.gn b/services/distributeddataservice/adapter/communicator/test/BUILD.gn index 5e5a3489d..df95b6bbd 100755 --- a/services/distributeddataservice/adapter/communicator/test/BUILD.gn +++ b/services/distributeddataservice/adapter/communicator/test/BUILD.gn @@ -223,7 +223,7 @@ ohos_unittest("SoftbusAdapterStandardTest") { "dsoftbus:softbus_client", "hilog:libhilog", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", "kv_store:distributeddata_inner", "kv_store:distributeddb", diff --git a/services/distributeddataservice/app/BUILD.gn b/services/distributeddataservice/app/BUILD.gn index 45849945d..85cd9d5be 100644 --- a/services/distributeddataservice/app/BUILD.gn +++ b/services/distributeddataservice/app/BUILD.gn @@ -148,7 +148,7 @@ ohos_shared_library("distributeddataservice") { "hitrace:hitrace_meter", "hitrace:libhitracechain", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", "kv_store:distributeddata_mgr", "kv_store:distributeddb", diff --git a/services/distributeddataservice/app/test/BUILD.gn b/services/distributeddataservice/app/test/BUILD.gn index 4feefbd64..dcf215b08 100644 --- a/services/distributeddataservice/app/test/BUILD.gn +++ b/services/distributeddataservice/app/test/BUILD.gn @@ -168,7 +168,7 @@ ohos_unittest("SessionManagerTest") { "hilog:libhilog", "hisysevent:libhisysevent", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:distributeddata_inner", "kv_store:distributeddata_mgr", "kv_store:distributeddb", @@ -242,7 +242,7 @@ ohos_unittest("KvStoreDataServiceClearTest") { "hitrace:hitrace_meter", "hitrace:libhitracechain", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:distributeddata_inner", "kv_store:distributeddata_mgr", "kv_store:distributeddb", diff --git a/services/distributeddataservice/app/test/fuzztest/dataservicestub_fuzzer/BUILD.gn b/services/distributeddataservice/app/test/fuzztest/dataservicestub_fuzzer/BUILD.gn index a04a1d620..9b6021a10 100644 --- a/services/distributeddataservice/app/test/fuzztest/dataservicestub_fuzzer/BUILD.gn +++ b/services/distributeddataservice/app/test/fuzztest/dataservicestub_fuzzer/BUILD.gn @@ -47,7 +47,6 @@ ohos_fuzztest("DataServiceStubFuzzTest") { "${data_service_path}/adapter/include/utils", "${data_service_path}/adapter/include", "${device_manager_path}/interfaces/inner_kits/native_cpp/include", - "//third_party/json/single_include", "${data_service_path}/adapter/include/communicator", ] diff --git a/services/distributeddataservice/framework/BUILD.gn b/services/distributeddataservice/framework/BUILD.gn index a99bba56a..538f2ab2a 100644 --- a/services/distributeddataservice/framework/BUILD.gn +++ b/services/distributeddataservice/framework/BUILD.gn @@ -141,7 +141,7 @@ ohos_shared_library("distributeddatasvcfwk") { "c_utils:utils", "common_event_service:cesfwk_innerkits", "hilog:libhilog", - "json:nlohmann_json_static", + "cJSON:cjson", "openssl:libcrypto_shared", ] subsystem_name = "distributeddatamgr" diff --git a/services/distributeddataservice/framework/include/cloud/subscription.h b/services/distributeddataservice/framework/include/cloud/subscription.h index 4054a91f3..29a8601c1 100644 --- a/services/distributeddataservice/framework/include/cloud/subscription.h +++ b/services/distributeddataservice/framework/include/cloud/subscription.h @@ -28,6 +28,9 @@ struct API_EXPORT Subscription final : public Serializable { std::map relations; bool Marshal(json &node) const override; bool Unmarshal(const json &node) override; + void SetRelations(Serializable::json &node, const std::map &values) { + Serializable::SetValue(node, values); + } }; bool Marshal(json &node) const; @@ -38,6 +41,9 @@ struct API_EXPORT Subscription final : public Serializable { static std::string GetKey(int32_t userId); static std::string GetRelationKey(int32_t userId, const std::string &bundleName); static std::string GetPrefix(const std::initializer_list &fields); + void SetSubscriptions(Serializable::json &node, const std::map &values) { + Serializable::SetValue(node, values); + } private: static constexpr const char *PREFIX = "CLOUD_SUBSCRIPTION"; diff --git a/services/distributeddataservice/framework/include/serializable/serializable.h b/services/distributeddataservice/framework/include/serializable/serializable.h index a0b6ad5a7..a85451289 100644 --- a/services/distributeddataservice/framework/include/serializable/serializable.h +++ b/services/distributeddataservice/framework/include/serializable/serializable.h @@ -15,14 +15,16 @@ #ifndef OHOS_DISTRIBUTED_DATA_FRAMEWORKS_COMMON_SERIALIZABLE_H #define OHOS_DISTRIBUTED_DATA_FRAMEWORKS_COMMON_SERIALIZABLE_H +#include #include #include +#include #include "visibility.h" #ifndef JSON_NOEXCEPTION #define JSON_NOEXCEPTION #endif #include -#include +struct cJSON; namespace OHOS { namespace DistributedData { #ifndef GET_NAME @@ -30,9 +32,99 @@ namespace DistributedData { #endif struct Serializable { public: - using json = nlohmann::json; - using size_type = nlohmann::json::size_type; - using error_handler_t = nlohmann::detail::error_handler_t; + class iterator; + class JSONWrapper final{ + public: + friend iterator; + enum class Type : uint8_t { + ARRAY, + OBJECT, + }; + API_EXPORT JSONWrapper(); + API_EXPORT JSONWrapper(cJSON *json, cJSON *root, const std::string &key = ""); + API_EXPORT JSONWrapper(const std::string &jsonStr); + API_EXPORT JSONWrapper(JSONWrapper &&jsonWrapper); + + API_EXPORT operator std::string() const; + API_EXPORT bool operator==(int32_t value) const; + API_EXPORT bool operator==(const std::string &value) const; + + API_EXPORT JSONWrapper &operator=(JSONWrapper &&jsonWrapper); + API_EXPORT JSONWrapper &operator=(JSONWrapper::Type type); + API_EXPORT JSONWrapper &operator=(bool value); + API_EXPORT JSONWrapper &operator=(int32_t value); + API_EXPORT JSONWrapper &operator=(uint32_t value); + API_EXPORT JSONWrapper &operator=(int64_t value); + API_EXPORT JSONWrapper &operator=(uint64_t value); + API_EXPORT JSONWrapper &operator=(double value); + API_EXPORT JSONWrapper &operator=(const char *value); + API_EXPORT JSONWrapper &operator=(const std::string &value); + API_EXPORT JSONWrapper &operator=(const std::vector &value); + API_EXPORT JSONWrapper &operator[](const std::string &key); + API_EXPORT JSONWrapper &operator[](size_t index); + API_EXPORT JSONWrapper &operator[](size_t index) const; + + API_EXPORT bool is_null() const; + API_EXPORT bool is_boolean() const; + API_EXPORT bool is_number_integer() const; + API_EXPORT bool is_number_unsigned() const; + API_EXPORT bool is_number_float() const; + API_EXPORT bool is_string() const; + API_EXPORT bool is_array() const; + API_EXPORT bool is_object() const; + API_EXPORT bool is_discarded() const; + API_EXPORT bool get_to(bool &values) const; + API_EXPORT bool get_to(int16_t &values) const; + API_EXPORT bool get_to(uint16_t &values) const; + API_EXPORT bool get_to(int32_t &values) const; + API_EXPORT bool get_to(uint32_t &values) const; + API_EXPORT bool get_to(int64_t &values) const; + API_EXPORT bool get_to(uint64_t &values) const; + API_EXPORT bool get_to(double &values) const; + API_EXPORT bool get_to(std::string &values) const; + API_EXPORT bool get_to(std::vector &values) const; + API_EXPORT size_t size() const; + API_EXPORT std::string dump() const; + API_EXPORT iterator find(const std::string &key) const; + API_EXPORT iterator begin() const; + API_EXPORT iterator end() const; + API_EXPORT ~JSONWrapper(); + API_EXPORT static JSONWrapper parse(const std::string &str); + API_EXPORT static bool accept(const std::string &str); + + API_EXPORT static JSONWrapper array(); + API_EXPORT void push_back(const JSONWrapper &value); + API_EXPORT static std::string to_string(const JSONWrapper &jsonWrapper); + API_EXPORT bool operator==(const std::map& value) const; + API_EXPORT bool operator==(const std::map& value) const; + API_EXPORT bool operator==(const std::vector& value) const; + API_EXPORT bool empty() const; + API_EXPORT JSONWrapper& operator=(const std::map& value); + API_EXPORT JSONWrapper &operator=(const std::map& value); + private: + void AddToRoot(); + JSONWrapper(const JSONWrapper& jsonWrapper) = delete; + JSONWrapper &operator=(const JSONWrapper &jsonWrapper) = delete; + cJSON *json_ = nullptr; + cJSON *root_ = nullptr; + std::string key_; + bool needDel_ = false; + mutable std::vector> children_; + }; + class iterator { + public: + API_EXPORT iterator(std::vector>::iterator it); + API_EXPORT iterator &operator++(); + API_EXPORT bool operator==(const iterator &iter) const; + API_EXPORT bool operator!=(const iterator &iter) const; + API_EXPORT const JSONWrapper &operator*() const; + API_EXPORT std::string key() const; + API_EXPORT const JSONWrapper &value() const; + + private: + std::vector>::iterator node_; + }; + using json = JSONWrapper; API_EXPORT json Marshall() const; template @@ -40,7 +132,7 @@ public: { json root; SetValue(root, values); - return root.dump(-1, ' ', false, error_handler_t::replace); + return root.dump(); } API_EXPORT bool Unmarshall(const std::string &jsonStr); @@ -128,8 +220,9 @@ bool Serializable::GetValue(const json &node, const std::string &name, std::vect return false; } bool result = true; - values.resize(subNode.size()); - for (size_type i = 0; i < subNode.size(); ++i) { + auto size = subNode.size(); + values.resize(size); + for (size_t i = 0; i < size; ++i) { result = GetValue(subNode[i], "", values[i]) && result; } return result; @@ -139,8 +232,8 @@ template bool Serializable::SetValue(json &node, const std::vector &values) { bool result = true; - size_type i = 0; - node = json::value_t::array; + size_t i = 0; + node = JSONWrapper::Type::ARRAY; for (const auto &value : values) { result = SetValue(node[i], value) && result; i++; @@ -166,7 +259,7 @@ template bool Serializable::SetValue(json &node, const std::map &values) { bool result = true; - node = json::value_t::object; + node = JSONWrapper::Type::OBJECT; for (const auto &[key, value] : values) { result = SetValue(node[key], value) && result; } diff --git a/services/distributeddataservice/framework/serializable/serializable.cpp b/services/distributeddataservice/framework/serializable/serializable.cpp index 253a93234..14f0b6431 100644 --- a/services/distributeddataservice/framework/serializable/serializable.cpp +++ b/services/distributeddataservice/framework/serializable/serializable.cpp @@ -13,7 +13,11 @@ * limitations under the License. */ +#define LOG_TAG "serializable" +#include "log_print.h" #include "serializable/serializable.h" + +#include namespace OHOS { namespace DistributedData { Serializable::json Serializable::Marshall() const @@ -25,13 +29,13 @@ Serializable::json Serializable::Marshall() const bool Serializable::Unmarshall(const std::string &jsonStr) { - json jsonObj = json::parse(jsonStr, nullptr, false); + json jsonObj = json::parse(jsonStr); if (jsonObj.is_discarded()) { // if the string size is less than 1, means the string is invalid. if (jsonStr.empty()) { return false; } - jsonObj = json::parse(jsonStr.substr(1), nullptr, false); // drop first char to adapt A's value; + jsonObj = json::parse(jsonStr.substr(1)); // drop first char to adapt A's value; if (jsonObj.is_discarded()) { return false; } @@ -41,13 +45,13 @@ bool Serializable::Unmarshall(const std::string &jsonStr) Serializable::json Serializable::ToJson(const std::string &jsonStr) { - json jsonObj = json::parse(jsonStr, nullptr, false); + json jsonObj = json::parse(jsonStr); if (jsonObj.is_discarded()) { // if the string size is less than 1, means the string is invalid. if (jsonStr.empty()) { return {}; } - jsonObj = json::parse(jsonStr.substr(1), nullptr, false); // drop first char to adapt A's value; + jsonObj = json::parse(jsonStr.substr(1)); // drop first char to adapt A's value; if (jsonObj.is_discarded()) { return {}; } @@ -58,7 +62,7 @@ Serializable::json Serializable::ToJson(const std::string &jsonStr) bool Serializable::IsJson(const std::string &jsonStr) { if (!json::accept(jsonStr)) { - return json::accept(jsonStr.begin() + 1, jsonStr.end()); + return json::accept(jsonStr.substr(1)); } return true; } @@ -69,8 +73,7 @@ bool Serializable::GetValue(const json &node, const std::string &name, std::stri if (subNode.is_null() || !subNode.is_string()) { return false; } - value = subNode; - return true; + return subNode.get_to(value); } bool Serializable::GetValue(const json &node, const std::string &name, uint32_t &value) @@ -147,8 +150,8 @@ bool Serializable::GetValue(const json &node, const std::string &name, std::vect if (subNode.is_null() || !subNode.is_array()) { return false; } - value = std::vector(subNode); - return true; + + return subNode.get_to(value); } bool Serializable::GetValue(const json &node, const std::string &name, Serializable &value) @@ -215,7 +218,7 @@ bool Serializable::SetValue(json &node, const Serializable &value) const Serializable::json &Serializable::GetSubNode(const json &node, const std::string &name) { - static const json jsonNull = json::value_t::null; + static const json jsonNull; if (node.is_discarded() || node.is_null()) { return jsonNull; } @@ -230,5 +233,713 @@ const Serializable::json &Serializable::GetSubNode(const json &node, const std:: } return *it; } + +Serializable::JSONWrapper::JSONWrapper() : root_(nullptr) +{ + json_ = cJSON_CreateNull(); +} + +Serializable::JSONWrapper::JSONWrapper(cJSON *json, cJSON *root, const std::string &key) + : json_(json), root_(root), key_(key), needDel_(root == nullptr) +{ +} + +Serializable::JSONWrapper::JSONWrapper(const std::string &jsonStr) : root_(nullptr) +{ + json_ = cJSON_Parse(jsonStr.c_str()); +} + +Serializable::JSONWrapper::JSONWrapper(JSONWrapper &&jsonWrapper) +{ + if (root_ == nullptr) { + cJSON_Delete(json_); + json_ = nullptr; + } + json_ = std::move(jsonWrapper.json_); + jsonWrapper.json_ = nullptr; + root_ = jsonWrapper.root_; + jsonWrapper.root_ = nullptr; + key_ = std::move(jsonWrapper.key_); + children_ = std::move(jsonWrapper.children_); +} + +Serializable::JSONWrapper::operator std::string() const +{ + return dump(); +} + +Serializable::JSONWrapper &Serializable::JSONWrapper::operator=(JSONWrapper &&jsonWrapper) +{ + if (root_ == nullptr) { + cJSON_Delete(json_); + json_ = nullptr; + } + json_ = std::move(jsonWrapper.json_); + jsonWrapper.json_ = nullptr; + root_ = jsonWrapper.root_; + jsonWrapper.root_ = nullptr; + key_ = std::move(jsonWrapper.key_); + children_ = std::move(jsonWrapper.children_); + return *this; +} + +Serializable::JSONWrapper &Serializable::JSONWrapper::operator=(Serializable::JSONWrapper::Type type) +{ + if (json_ != nullptr) { + ZLOGE("cannot use operator[]"); + return *this; + } + switch (type) { + case Type::ARRAY: + json_ = cJSON_CreateArray(); + break; + case Type::OBJECT: + json_ = cJSON_CreateObject(); + } + if (json_ == nullptr || root_ == nullptr) { + return *this; + } + AddToRoot(); + return *this; +} + +Serializable::JSONWrapper &Serializable::JSONWrapper::operator=(bool value) +{ + if (root_ == nullptr && cJSON_IsNull(json_)) { + cJSON_Delete(json_); + json_ = nullptr; + } + if (json_ != nullptr) { + if (cJSON_IsBool(json_)) { + cJSON_SetBoolValue(json_, value); + } + return *this; + } + json_ = cJSON_CreateBool(value); + if (json_ == nullptr || root_ == nullptr) { + return *this; + } + AddToRoot(); + return *this; +} + +Serializable::JSONWrapper &Serializable::JSONWrapper::operator=(int32_t value) +{ + if (root_ == nullptr && cJSON_IsNull(json_)) { + cJSON_Delete(json_); + json_ = nullptr; + } + if (json_ != nullptr) { + if (cJSON_IsNumber(json_)) { + cJSON_SetNumberValue(json_, value); + } + return *this; + } + json_ = cJSON_CreateNumber(value); + if (json_ == nullptr || root_ == nullptr) { + return *this; + } + AddToRoot(); + return *this; +} + +Serializable::JSONWrapper &Serializable::JSONWrapper::operator=(uint32_t value) +{ + int32_t number = static_cast(value); + return operator=(number); +} + +Serializable::JSONWrapper &Serializable::JSONWrapper::operator=(int64_t value) +{ + if (root_ == nullptr && cJSON_IsNull(json_)) { + cJSON_Delete(json_); + json_ = nullptr; + } + if (json_ != nullptr) { + if (cJSON_IsNumber(json_)) { + cJSON_SetNumberValue(json_, value); + //cJSON_SetInt64NumberValue(json_, value); + } + return *this; + } + json_ = cJSON_CreateNumber(value); + //json_ = cJSON_CreateInt64Number(value); + if (json_ == nullptr || root_ == nullptr) { + return *this; + } + AddToRoot(); + return *this; +} + +Serializable::JSONWrapper &Serializable::JSONWrapper::operator=(uint64_t value) +{ + int64_t number = static_cast(value); + return operator=(number); +} + +Serializable::JSONWrapper &Serializable::JSONWrapper::operator=(double value) +{ + if (root_ == nullptr && cJSON_IsNull(json_)) { + cJSON_Delete(json_); + json_ = nullptr; + } + if (json_ != nullptr) { + if (cJSON_IsNumber(json_)) { + cJSON_SetNumberValue(json_, value); + } + return *this; + } + json_ = cJSON_CreateNumber(value); + if (json_ == nullptr || root_ == nullptr) { + return *this; + } + AddToRoot(); + return *this; +} + +Serializable::JSONWrapper &Serializable::JSONWrapper::operator=(const char *value) +{ + if (root_ == nullptr && cJSON_IsNull(json_)) { + cJSON_Delete(json_); + json_ = nullptr; + } + if (json_ != nullptr) { + return *this; + } + json_ = cJSON_CreateString(value); + if (json_ == nullptr || root_ == nullptr) { + return *this; + } + AddToRoot(); + return *this; +} + +Serializable::JSONWrapper &Serializable::JSONWrapper::operator=(const std::string &value) +{ + return operator=(value.c_str()); +} + +Serializable::JSONWrapper &Serializable::JSONWrapper::operator=(const std::vector &value) +{ + if (root_ == nullptr && cJSON_IsNull(json_)) { + cJSON_Delete(json_); + json_ = nullptr; + } + if (json_ != nullptr) { + return *this; + } + json_ = cJSON_CreateArray(); + children_.clear(); + for (size_t i = 0; json_ && (i < value.size()); i++) { + auto node = cJSON_CreateNumber(value[i]); + if (!node || !cJSON_AddItemToArray(json_, node)) { + cJSON_Delete(json_); + json_ = nullptr; + children_.clear(); + return *this; + } + children_.push_back(std::make_shared(node, json_)); + } + if (json_ == nullptr || root_ == nullptr) { + return *this; + } + AddToRoot(); + return *this; +} + +Serializable::JSONWrapper &Serializable::JSONWrapper::operator[](const std::string &key) +{ + if (root_ == nullptr && cJSON_IsNull(json_)) { + cJSON_Delete(json_); + json_ = nullptr; + } + if (json_ == nullptr) { + json_ = cJSON_CreateObject(); + if (json_ != nullptr && root_ != nullptr) { + AddToRoot(); + } + } + if (!is_object()) { + ZLOGE("cannot use operator[]."); + //throw std::invalid_argument("cannot use operator[]"); + } + auto it = children_.begin(); + while (it != children_.end()) { + if ((*it)->key_ == key) { + return **it; + } + ++it; + } + auto item = cJSON_GetObjectItem(json_, key.c_str()); + auto res = std::make_shared(item, json_, key); + children_.push_back(res); + return *res; +} + +Serializable::JSONWrapper &Serializable::JSONWrapper::operator[](size_t index) +{ + if (root_ == nullptr && cJSON_IsNull(json_)) { + cJSON_Delete(json_); + json_ = nullptr; + } + if (json_ == nullptr) { + json_ = cJSON_CreateArray(); + if (json_ != nullptr && root_ != nullptr) { + AddToRoot(); + } + } + if (!is_array()) { + ZLOGE("cannot use operator[]."); + //throw std::invalid_argument("cannot use operator[]"); + } + int size = cJSON_GetArraySize(json_); + auto len = children_.size(); + while (len < size) { + auto item = cJSON_GetArrayItem(json_, len); + children_.push_back(std::make_shared(item, json_)); + len++; + } + if (index > len) { + ZLOGE("cannot use operator[]."); + //throw std::invalid_argument("cannot use operator[]"); + } + if (index == len) { + children_.push_back(std::make_shared(nullptr, json_)); + } + return *children_[index]; +} + +Serializable::JSONWrapper &Serializable::JSONWrapper::operator[](size_t index) const +{ + if (!is_array()) { + ZLOGE("invalid args."); + //throw std::invalid_argument("invalid args"); + } + int size = cJSON_GetArraySize(json_); + if (index >= size) { + ZLOGE("invalid args."); + //throw std::out_of_range("invalid args"); + } + auto len = children_.size(); + while (len < size) { + auto item = cJSON_GetArrayItem(json_, len); + children_.push_back(std::make_shared(item, json_)); + len++; + } + return *children_[index]; +} + +bool Serializable::JSONWrapper::is_null() const +{ + return cJSON_IsNull(json_); +} + +bool Serializable::JSONWrapper::is_boolean() const +{ + return cJSON_IsBool(json_); +} + +bool Serializable::JSONWrapper::is_number_integer() const +{ + return cJSON_IsNumber(json_); +} + +bool Serializable::JSONWrapper::is_number_unsigned() const +{ + return cJSON_IsNumber(json_) && cJSON_GetNumberValue(json_) >= 0; +} + +bool Serializable::JSONWrapper::is_number_float() const +{ + return cJSON_IsNumber(json_); +} + +bool Serializable::JSONWrapper::is_string() const +{ + return cJSON_IsString(json_); +} + +bool Serializable::JSONWrapper::is_array() const +{ + return cJSON_IsArray(json_); +} + +bool Serializable::JSONWrapper::is_object() const +{ + return cJSON_IsObject(json_); +} + +bool Serializable::JSONWrapper::is_discarded() const +{ + return json_ == nullptr; +} + +bool Serializable::JSONWrapper::accept(const std::string &str) +{ + return cJSON_Parse(str.c_str()) != nullptr; +} + +bool Serializable::JSONWrapper::get_to(bool &values) const +{ + if (json_ == nullptr || !is_boolean()) { + return false; + } + + values = cJSON_IsTrue(json_) ? true : false; + return true; +} + +bool Serializable::JSONWrapper::get_to(int16_t &values) const +{ + if (json_ == nullptr || !is_number_integer()) { + return false; + } + values = json_->valueint; + return true; +} + +bool Serializable::JSONWrapper::get_to(uint16_t &values) const +{ + if (json_ == nullptr || !is_number_unsigned()) { + return false; + } + values = json_->valueint; + return true; +} + +bool Serializable::JSONWrapper::get_to(int32_t &values) const +{ + if (json_ == nullptr || !is_number_integer()) { + return false; + } + values = json_->valueint; + return true; +} + +bool Serializable::JSONWrapper::get_to(uint32_t &values) const +{ + if (json_ == nullptr || !is_number_unsigned()) { + return false; + } + values = json_->valueint; + return true; +} + +bool Serializable::JSONWrapper::get_to(int64_t &values) const +{ + if (json_ == nullptr || !is_number_integer()) { + return false; + } + values = json_->valueint; + return true; +} + +bool Serializable::JSONWrapper::get_to(uint64_t &values) const +{ + if (json_ == nullptr || !is_number_unsigned()) { + return false; + } + values = json_->valueint; + return true; +} + +bool Serializable::JSONWrapper::get_to(double &values) const +{ + if (json_ == nullptr || !is_number_integer()) { + return false; + } + values = cJSON_GetNumberValue(json_); + return true; +} + +bool Serializable::JSONWrapper::get_to(std::string &values) const +{ + if (json_ == nullptr || !is_string()) { + return false; + } + values = cJSON_GetStringValue(json_); + return true; +} + +bool Serializable::JSONWrapper::get_to(std::vector &values) const +{ + if (json_ == nullptr || !is_array()) { + return false; + } + auto size = cJSON_GetArraySize(json_); + values.clear(); + values.reserve(size); + for (auto i = 0; i < size; i++) { + auto item = cJSON_GetArrayItem(json_, i); + if (item) { + values.push_back(cJSON_GetNumberValue(item)); + } + } + return true; +} + +bool Serializable::JSONWrapper::empty() const { + if (json_ == nullptr) { + return true; + } + if (cJSON_IsNull(json_)) { + return true; + } + if (cJSON_IsArray(json_)) { + return cJSON_GetArraySize(json_) == 0; + } + if (cJSON_IsObject(json_)) { + int size = 0; + cJSON *child = json_->child; + while (child) { + size++; + child = child->next; + } + return size == 0; + } + return false; +} + +size_t Serializable::JSONWrapper::size() const +{ + if (!cJSON_IsArray(json_) && !cJSON_IsObject(json_)) { + return 0; + } + return cJSON_GetArraySize(json_); +} + +std::string Serializable::JSONWrapper::dump() const +{ + if (json_ == nullptr) { + return ""; + } + return cJSON_PrintUnformatted(json_); +} + +Serializable::iterator Serializable::JSONWrapper::find(const std::string &key) const +{ + auto size = cJSON_GetArraySize(json_); + auto len = children_.size(); + if (len != size) { + children_.clear(); + for (int i = 0; i < size; i++) { + auto item = cJSON_GetArrayItem(json_, i); + children_.push_back(std::make_shared(item, json_, item != nullptr ? item->string : "")); + } + } + auto it = children_.begin(); + while (it != children_.end()) { + if ((*it)->key_ == key) { + return it; + } + ++it; + } + return it; +} + +Serializable::iterator Serializable::JSONWrapper::begin() const +{ + if (json_ == nullptr || (!is_array() && !is_object())) { + ZLOGE("not support."); + //throw std::logic_error("not support"); + } + auto size = cJSON_GetArraySize(json_); + auto len = children_.size(); + if (len != size) { + children_.clear(); + for (int i = 0; i < size; i++) { + auto item = cJSON_GetArrayItem(json_, i); + children_.push_back(std::make_shared(item, json_, item != nullptr ? item->string : "")); + } + } + return children_.begin(); +} + +Serializable::iterator Serializable::JSONWrapper::end() const +{ + if (json_ == nullptr || json_->child == nullptr || (!is_array() && !is_object())) { + ZLOGE("not support."); + //throw std::logic_error("not support"); + } + auto size = cJSON_GetArraySize(json_); + auto len = children_.size(); + if (len != size) { + children_.clear(); + for (int i = 0; i < size; i++) { + auto item = cJSON_GetArrayItem(json_, i); + children_.push_back(std::make_shared(item, json_, item != nullptr ? item->string : "")); + } + } + return children_.end(); +} + +Serializable::JSONWrapper::~JSONWrapper() +{ + if (needDel_ && root_ == nullptr && json_ != nullptr) { + cJSON_Delete(json_); + } +} + +Serializable::JSONWrapper Serializable::JSONWrapper::parse(const std::string &str) +{ + return Serializable::JSONWrapper(cJSON_Parse(str.c_str()), nullptr); +} + +bool Serializable::JSONWrapper::operator==(int32_t value) const +{ + return value == cJSON_GetNumberValue(json_); +} + +bool Serializable::JSONWrapper::operator==(const std::string &value) const +{ + return value == cJSON_GetStringValue(json_); +} + +void Serializable::JSONWrapper::AddToRoot() +{ + if (!key_.empty()) { + if (!cJSON_AddItemToObject(root_, key_.c_str(), json_)) { + cJSON_Delete(json_); + json_ = nullptr; + } + } else { + if (!cJSON_AddItemToArray(root_, json_)) { + cJSON_Delete(json_); + json_ = nullptr; + } + } +} + +Serializable::iterator::iterator(std::vector>::iterator it) : node_(it) {} + +Serializable::iterator &Serializable::iterator::operator++() +{ + node_++; + return *this; +} + +bool Serializable::iterator::operator==(const Serializable::iterator &iter) const +{ + return node_ == iter.node_; +} + +bool Serializable::iterator::operator!=(const Serializable::iterator &iter) const +{ + return !operator==(iter); +} + +const Serializable::JSONWrapper &Serializable::iterator::operator*() const +{ + return **node_; +} + +std::string Serializable::iterator::key() const +{ + return (*node_)->key_; +} + +const Serializable::JSONWrapper &Serializable::iterator::value() const +{ + return operator*(); +} + +Serializable::JSONWrapper Serializable::JSONWrapper::array() +{ + cJSON* json = cJSON_CreateArray(); + return Serializable::JSONWrapper(json, nullptr, ""); +} + +void Serializable::JSONWrapper::push_back(const JSONWrapper &value) +{ + if (is_array()) { + cJSON_AddItemToArray(json_, value.json_); + children_.push_back(std::make_shared(value.json_, json_)); + } +} + +std::string Serializable::JSONWrapper::to_string(const JSONWrapper &jsonWrapper) +{ + return jsonWrapper.dump(); +} + +bool Serializable::JSONWrapper::operator==(const std::map& value) const +{ + if (!is_object()) { + return false; + } + if (cJSON_GetArraySize(json_) != value.size()) { + return false; + } + for (const auto& pair : value) { + auto item = cJSON_GetObjectItem(json_, pair.first.c_str()); + if (item == nullptr || std::string(cJSON_GetStringValue(item)) != pair.second) { + return false; + } + } + return true; +} + +bool Serializable::JSONWrapper::operator==(const std::map& value) const +{ + if (!is_object()) { + return false; + } + if (cJSON_GetArraySize(json_) != value.size()) { + return false; + } + for (const auto& pair : value) { + auto item = cJSON_GetObjectItem(json_, pair.first.c_str()); + if (item == nullptr || cJSON_GetNumberValue(item) != pair.second) { + return false; + } + } + return true; +} + +bool Serializable::JSONWrapper::operator==(const std::vector& value) const +{ + if (!is_array()) { + return false; + } + if (cJSON_GetArraySize(json_) != value.size()) { + return false; + } + for (size_t i = 0; i < value.size(); ++i) { + auto item = cJSON_GetArrayItem(json_, i); + if (item == nullptr || std::string(cJSON_GetStringValue(item)) != value[i]) { + return false; + } + } + return true; +} + +Serializable::JSONWrapper& Serializable::JSONWrapper::operator=(const std::map& value) +{ + if (json_) { + cJSON_Delete(json_); + } + json_ = cJSON_CreateObject(); + for (const auto& pair : value) { + cJSON* num = cJSON_CreateNumber(pair.second); + cJSON_AddItemToObject(json_, pair.first.c_str(), num); + } + children_.clear(); + return *this; +} + +Serializable::JSONWrapper& Serializable::JSONWrapper::operator=(const std::map& value) +{ + if (json_) { + cJSON_Delete(json_); + } + json_ = cJSON_CreateObject(); + for (const auto& pair : value) { + cJSON* str = cJSON_CreateString(pair.second.c_str()); + cJSON_AddItemToObject(json_, pair.first.c_str(), str); + } + children_.clear(); + return *this; +} + } // namespace DistributedData } // namespace OHOS diff --git a/services/distributeddataservice/framework/test/BUILD.gn b/services/distributeddataservice/framework/test/BUILD.gn index 4417c7c7a..4da523edc 100644 --- a/services/distributeddataservice/framework/test/BUILD.gn +++ b/services/distributeddataservice/framework/test/BUILD.gn @@ -121,7 +121,7 @@ ohos_unittest("ServiceUtilsTest") { "googletest:gtest_main", "hilog:libhilog", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", ] deps = [ "${data_service_path}/framework:distributeddatasvcfwk" ] @@ -199,7 +199,7 @@ ohos_unittest("CloudInfoTest") { deps = [ "${data_service_path}/framework:distributeddatasvcfwk" ] external_deps = [ - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", ] } @@ -225,7 +225,7 @@ ohos_unittest("SubscriptionTest") { configs = [ ":module_private_config" ] deps = [ "${data_service_path}/framework:distributeddatasvcfwk" ] external_deps = [ - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", ] } @@ -250,7 +250,7 @@ ohos_unittest("MetaDataManagerTest") { "googletest:gtest_main", "hilog:libhilog", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", ] deps = [ @@ -313,7 +313,7 @@ ohos_unittest("ServiceMetaDataTest") { "hitrace:hitrace_meter", "hitrace:libhitracechain", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:distributeddata_inner", "kv_store:distributeddata_mgr", "kv_store:distributeddb", diff --git a/services/distributeddataservice/framework/test/cloud_test.cpp b/services/distributeddataservice/framework/test/cloud_test.cpp index 5179ef017..f5a22b8e2 100644 --- a/services/distributeddataservice/framework/test/cloud_test.cpp +++ b/services/distributeddataservice/framework/test/cloud_test.cpp @@ -22,7 +22,6 @@ #include "cloud/cloud_info.h" #include "cloud/cloud_server.h" #include "cloud/schema_meta.h" -#include "nlohmann/json.hpp" #include "utils/crypto.h" #include "screen/screen_manager.h" #include "store/general_store.h" @@ -249,7 +248,7 @@ HWTEST_F(CloudInfoTest, CloudInfoTest001, TestSize.Level0) Serializable::json node1; cloudInfo1.Marshal(node1); - EXPECT_EQ(Serializable::Marshall(cloudInfo1), to_string(node1)); + EXPECT_EQ(Serializable::Marshall(cloudInfo1), Serializable::JSONWrapper::to_string(node1)); CloudInfo cloudInfo2; cloudInfo2.Unmarshal(node1); @@ -274,7 +273,7 @@ HWTEST_F(CloudInfoTest, AppInfoTest, TestSize.Level0) Serializable::json node1; cloudInfoAppInfo1.Marshal(node1); - EXPECT_EQ(Serializable::Marshall(cloudInfoAppInfo1), to_string(node1)); + EXPECT_EQ(Serializable::Marshall(cloudInfoAppInfo1), Serializable::JSONWrapper::to_string(node1)); CloudInfo::AppInfo cloudInfoAppInfo2; cloudInfoAppInfo2.Unmarshal(node1); @@ -304,7 +303,7 @@ HWTEST_F(CloudInfoTest, TableTest, TestSize.Level0) table1.fields.push_back(field1); Serializable::json node1; table1.Marshal(node1); - EXPECT_EQ(Serializable::Marshall(table1), to_string(node1)); + EXPECT_EQ(Serializable::Marshall(table1), Serializable::JSONWrapper::to_string(node1)); Table table2; table2.Unmarshal(node1); diff --git a/services/distributeddataservice/framework/test/meta_data_test.cpp b/services/distributeddataservice/framework/test/meta_data_test.cpp index 58359051e..f36343c3e 100644 --- a/services/distributeddataservice/framework/test/meta_data_test.cpp +++ b/services/distributeddataservice/framework/test/meta_data_test.cpp @@ -35,7 +35,7 @@ #include "metadata/device_meta_data.h" #include "utils/constant.h" #include "gtest/gtest.h" -#include +#include "serializable/serializable.h" using namespace testing::ext; using namespace OHOS; using namespace OHOS::DistributedKv; diff --git a/services/distributeddataservice/framework/test/serializable_test.cpp b/services/distributeddataservice/framework/test/serializable_test.cpp index 14a00bf91..4c8ece234 100644 --- a/services/distributeddataservice/framework/test/serializable_test.cpp +++ b/services/distributeddataservice/framework/test/serializable_test.cpp @@ -128,7 +128,7 @@ HWTEST_F(SerializableTest, GetNormalVal, TestSize.Level2) normal.value = -56; normal.isClear = true; normal.cols = {"adfasdfas"}; - auto jstr = to_string(normal.Marshall()); + auto jstr = Serializable::JSONWrapper::to_string(normal.Marshall()); Normal normal1; normal1.Unmarshall(jstr); ASSERT_TRUE(normal == normal1) << normal1.name; @@ -161,7 +161,7 @@ HWTEST_F(SerializableTest, GetMutilVal, TestSize.Level2) NormalEx normalEx; normalEx.normals = {Normal()}; normalEx.name = "normalEx"; - auto jstr = to_string(normalEx.Marshall()); + auto jstr = Serializable::JSONWrapper::to_string(normalEx.Marshall()); NormalEx normal1; normal1.Unmarshall(jstr); ASSERT_TRUE(normalEx == normal1) << normal1.name; @@ -296,7 +296,7 @@ HWTEST_F(SerializableTest, SetPointerValue, TestSize.Level2) in.value = new int64_t(-100); in.status = new uint32_t(110); in.isClear = new bool(true); - auto json = to_string(in.Marshall()); + auto json = Serializable::JSONWrapper::to_string(in.Marshall()); Test out; out.Unmarshall(json); ASSERT_TRUE(in == out) << in.count; diff --git a/services/distributeddataservice/rust/extension/BUILD.gn b/services/distributeddataservice/rust/extension/BUILD.gn index d1c0fdc1d..1bd6a4d64 100644 --- a/services/distributeddataservice/rust/extension/BUILD.gn +++ b/services/distributeddataservice/rust/extension/BUILD.gn @@ -61,7 +61,7 @@ ohos_shared_library("opencloudextension") { external_deps = [ "access_token:libaccesstoken_sdk", "hilog:libhilog", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", ] subsystem_name = "distributeddatamgr" diff --git a/services/distributeddataservice/service/backup/BUILD.gn b/services/distributeddataservice/service/backup/BUILD.gn index 6b90fa32f..d0e21358c 100755 --- a/services/distributeddataservice/service/backup/BUILD.gn +++ b/services/distributeddataservice/service/backup/BUILD.gn @@ -56,7 +56,7 @@ ohos_source_set("distributeddata_backup") { external_deps = [ "device_manager:devicemanagersdk", "hilog:libhilog", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", ] subsystem_name = "distributeddatamgr" diff --git a/services/distributeddataservice/service/bootstrap/BUILD.gn b/services/distributeddataservice/service/bootstrap/BUILD.gn index ff48eaece..0f6d8f04d 100644 --- a/services/distributeddataservice/service/bootstrap/BUILD.gn +++ b/services/distributeddataservice/service/bootstrap/BUILD.gn @@ -54,7 +54,7 @@ ohos_source_set("distributeddata_bootstrap") { external_deps = [ "hilog:libhilog", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", ] subsystem_name = "distributeddatamgr" diff --git a/services/distributeddataservice/service/cloud/BUILD.gn b/services/distributeddataservice/service/cloud/BUILD.gn index b36909c07..92a49cb1e 100755 --- a/services/distributeddataservice/service/cloud/BUILD.gn +++ b/services/distributeddataservice/service/cloud/BUILD.gn @@ -70,7 +70,7 @@ ohos_source_set("distributeddata_cloud") { "access_token:libtokenid_sdk", "device_manager:devicemanagersdk", "hicollie:libhicollie", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", "kv_store:distributeddb", "relational_store:cloud_data_inner", diff --git a/services/distributeddataservice/service/config/BUILD.gn b/services/distributeddataservice/service/config/BUILD.gn index b5d636802..ed9bd009e 100644 --- a/services/distributeddataservice/service/config/BUILD.gn +++ b/services/distributeddataservice/service/config/BUILD.gn @@ -59,7 +59,7 @@ ohos_source_set("distributeddata_config") { deps = [ "${data_service_path}/framework:distributeddatasvcfwk" ] external_deps = [ "hilog:libhilog", - "json:nlohmann_json_static", + "cJSON:cjson", ] subsystem_name = "distributeddatamgr" part_name = "datamgr_service" diff --git a/services/distributeddataservice/service/config/src/model/component_config.cpp b/services/distributeddataservice/service/config/src/model/component_config.cpp index 3810ece2b..9195e7dc8 100644 --- a/services/distributeddataservice/service/config/src/model/component_config.cpp +++ b/services/distributeddataservice/service/config/src/model/component_config.cpp @@ -36,7 +36,7 @@ bool ComponentConfig::Unmarshal(const json &node) GetValue(node, GET_NAME(destructor), destructor); const auto &subNode = GetSubNode(node, GET_NAME(params)); if (!subNode.is_null()) { - params = to_string(subNode); + params = Serializable::JSONWrapper::to_string(subNode); } return true; } diff --git a/services/distributeddataservice/service/data_share/BUILD.gn b/services/distributeddataservice/service/data_share/BUILD.gn index 8bc36903c..0709cc267 100644 --- a/services/distributeddataservice/service/data_share/BUILD.gn +++ b/services/distributeddataservice/service/data_share/BUILD.gn @@ -129,7 +129,7 @@ ohos_source_set("data_share_service") { "hisysevent:libhisysevent", "init:libbegetutil", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", "kv_store:distributeddb", "qos_manager:concurrent_task_client", diff --git a/services/distributeddataservice/service/dumper/BUILD.gn b/services/distributeddataservice/service/dumper/BUILD.gn index 72b194d79..813707ad5 100644 --- a/services/distributeddataservice/service/dumper/BUILD.gn +++ b/services/distributeddataservice/service/dumper/BUILD.gn @@ -42,7 +42,7 @@ ohos_source_set("distributeddata_dumper") { deps = [ "${data_service_path}/framework:distributeddatasvcfwk" ] external_deps = [ "hilog:libhilog", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", "kv_store:distributeddb", ] diff --git a/services/distributeddataservice/service/kvdb/BUILD.gn b/services/distributeddataservice/service/kvdb/BUILD.gn index 874dc361c..011ace89b 100644 --- a/services/distributeddataservice/service/kvdb/BUILD.gn +++ b/services/distributeddataservice/service/kvdb/BUILD.gn @@ -78,7 +78,7 @@ ohos_source_set("distributeddata_kvdb") { "hilog:libhilog", "hisysevent:libhisysevent", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", "kv_store:distributeddb", "kv_store:kvdb_inner_lite", diff --git a/services/distributeddataservice/service/matrix/BUILD.gn b/services/distributeddataservice/service/matrix/BUILD.gn index e7f2d0a63..fc0110efb 100755 --- a/services/distributeddataservice/service/matrix/BUILD.gn +++ b/services/distributeddataservice/service/matrix/BUILD.gn @@ -58,7 +58,7 @@ ohos_source_set("distributeddata_matrix") { external_deps = [ "device_manager:devicemanagersdk", "hilog:libhilog", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", ] subsystem_name = "distributeddatamgr" diff --git a/services/distributeddataservice/service/permission/BUILD.gn b/services/distributeddataservice/service/permission/BUILD.gn index 2795bda98..3eba0a70f 100644 --- a/services/distributeddataservice/service/permission/BUILD.gn +++ b/services/distributeddataservice/service/permission/BUILD.gn @@ -62,7 +62,7 @@ ohos_source_set("distributeddata_permit") { "device_auth:deviceauth_sdk", "device_manager:devicemanagersdk", "hilog:libhilog", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", "kv_store:distributeddb", ] diff --git a/services/distributeddataservice/service/test/BUILD.gn b/services/distributeddataservice/service/test/BUILD.gn index 9955ea5e3..f64c9a312 100644 --- a/services/distributeddataservice/service/test/BUILD.gn +++ b/services/distributeddataservice/service/test/BUILD.gn @@ -534,7 +534,7 @@ ohos_unittest("KVDBGeneralStoreAbnormalTest") { "googletest:gtest_main", "hilog:libhilog", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:distributeddata_inner", "kv_store:distributeddb", "relational_store:native_rdb", @@ -741,7 +741,7 @@ ohos_unittest("ObjectAssetLoaderTest") { "hilog:libhilog", "hisysevent:libhisysevent", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:distributeddata_inner", ] @@ -780,7 +780,7 @@ ohos_unittest("ObjectAssetMachineTest") { "hilog:libhilog", "hisysevent:libhisysevent", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:distributeddata_inner", ] @@ -877,7 +877,7 @@ ohos_unittest("ObjectManagerTest") { "hilog:libhilog", "hisysevent:libhisysevent", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:distributeddata_inner", "kv_store:distributeddata_mgr", "kv_store:distributeddb", @@ -920,7 +920,7 @@ ohos_unittest("ObjectSnapshotTest") { "hilog:libhilog", "hisysevent:libhisysevent", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:distributeddata_inner", ] @@ -965,7 +965,7 @@ ohos_unittest("MetaDataTest") { "hilog:libhilog", "hisysevent:libhisysevent", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:distributeddata_inner", "kv_store:distributeddb", ] @@ -1049,7 +1049,6 @@ ohos_unittest("DataShareServiceImplTest") { "${datashare_path}/frameworks/native/common/include", "${datashare_path}/interfaces/inner_api/common/include", "${datashare_path}/interfaces/inner_api/consumer/include", - "//third_party/json/single_include", ] sources = [ @@ -1147,7 +1146,7 @@ ohos_unittest("DataShareServiceImplTest") { "huks:libhukssdk", "init:libbegetutil", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:distributeddata_inner", "kv_store:distributeddb", "kv_store:distributeddb", @@ -1296,7 +1295,7 @@ ohos_unittest("UdmfServiceImplTest") { "device_manager:devicemanagersdk", "googletest:gtest_main", "hilog:libhilog", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:distributeddata_inner", "kv_store:distributeddb", "relational_store:native_rdb", @@ -1664,7 +1663,7 @@ ohos_unittest("PermitDelegateMockTest") { "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:distributeddata_inner", "kv_store:distributeddb", ] @@ -1764,7 +1763,7 @@ ohos_unittest("QueryHelperUnitTest") { "hilog:libhilog", "hisysevent:libhisysevent", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", "kv_store:distributeddb", "kv_store:kvdb_inner_lite", @@ -1794,7 +1793,7 @@ ohos_unittest("AuthDelegateMockTest") { "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:distributeddata_inner", ] @@ -1845,7 +1844,7 @@ ohos_unittest("UpgradeMockTest") { "googletest:gtest_main", "hilog:libhilog", "huks:libhukssdk", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", "kv_store:distributeddb", ] @@ -1893,7 +1892,7 @@ ohos_unittest("UserDelegateMockTest") { "googletest:gmock_main", "googletest:gtest_main", "hilog:libhilog", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:datamgr_common", "kv_store:distributeddb", ] diff --git a/services/distributeddataservice/service/test/fuzztest/cloudservicestub_fuzzer/BUILD.gn b/services/distributeddataservice/service/test/fuzztest/cloudservicestub_fuzzer/BUILD.gn index ca4c9f005..f6bce616e 100644 --- a/services/distributeddataservice/service/test/fuzztest/cloudservicestub_fuzzer/BUILD.gn +++ b/services/distributeddataservice/service/test/fuzztest/cloudservicestub_fuzzer/BUILD.gn @@ -47,7 +47,6 @@ ohos_fuzztest("CloudServiceStubFuzzTest") { "${relational_store_path}/interfaces/inner_api/cloud_data/include", "${relational_store_path}/interfaces/inner_api/rdb/include", "${relational_store_path}/interfaces/inner_api/common_type/include", - "//third_party/json/single_include", "${data_service_path}/adapter/include/communicator", ] diff --git a/services/distributeddataservice/service/test/fuzztest/datashareservicestub_fuzzer/BUILD.gn b/services/distributeddataservice/service/test/fuzztest/datashareservicestub_fuzzer/BUILD.gn index dfb20f04e..d5f5b9190 100644 --- a/services/distributeddataservice/service/test/fuzztest/datashareservicestub_fuzzer/BUILD.gn +++ b/services/distributeddataservice/service/test/fuzztest/datashareservicestub_fuzzer/BUILD.gn @@ -37,7 +37,6 @@ ohos_fuzztest("DataShareServiceStubFuzzTest") { "${datashare_path}/frameworks/native/common/include", "${datashare_path}/interfaces/inner_api/common/include", "${datashare_path}/interfaces/inner_api/consumer/include", - "//third_party/json/single_include", "${data_service_path}/adapter/include/communicator", ] diff --git a/services/distributeddataservice/service/test/fuzztest/dumphelper_fuzzer/BUILD.gn b/services/distributeddataservice/service/test/fuzztest/dumphelper_fuzzer/BUILD.gn index 2fd165553..81422a3a9 100644 --- a/services/distributeddataservice/service/test/fuzztest/dumphelper_fuzzer/BUILD.gn +++ b/services/distributeddataservice/service/test/fuzztest/dumphelper_fuzzer/BUILD.gn @@ -33,7 +33,6 @@ ohos_fuzztest("DumpHelperFuzzTest") { "${relational_store_path}/interfaces/inner_api/cloud_data/include", "${relational_store_path}/interfaces/inner_api/rdb/include", "${relational_store_path}/interfaces/inner_api/common_type/include", - "//third_party/json/single_include", ] fuzz_config_file = diff --git a/services/distributeddataservice/service/test/fuzztest/kvdbservicestub_fuzzer/BUILD.gn b/services/distributeddataservice/service/test/fuzztest/kvdbservicestub_fuzzer/BUILD.gn index 87efa4b39..e817fcadf 100644 --- a/services/distributeddataservice/service/test/fuzztest/kvdbservicestub_fuzzer/BUILD.gn +++ b/services/distributeddataservice/service/test/fuzztest/kvdbservicestub_fuzzer/BUILD.gn @@ -42,7 +42,6 @@ ohos_fuzztest("KvdbServiceStubFuzzTest") { "${kv_store_distributeddb_path}/interfaces/include/", "${kv_store_distributeddb_path}/interfaces/include/relational", "${relational_store_path}/interfaces/inner_api/common_type/include", - "//third_party/json/single_include", "${data_service_path}/adapter/include/communicator", "${data_service_path}/adapter/include/utils", ] diff --git a/services/distributeddataservice/service/test/fuzztest/objectservicestub_fuzzer/BUILD.gn b/services/distributeddataservice/service/test/fuzztest/objectservicestub_fuzzer/BUILD.gn index e3d93e45b..95fc9ae4c 100755 --- a/services/distributeddataservice/service/test/fuzztest/objectservicestub_fuzzer/BUILD.gn +++ b/services/distributeddataservice/service/test/fuzztest/objectservicestub_fuzzer/BUILD.gn @@ -41,7 +41,6 @@ ohos_fuzztest("ObjectServiceStubFuzzTest") { "${dataobject_path}/frameworks/innerkitsimpl/include", "${dataobject_path}/frameworks/innerkitsimpl/include/common", "${dataobject_path}/interfaces/innerkits", - "//third_party/json/single_include", "${relational_store_path}/interfaces/inner_api/common_type/include", "${data_service_path}/adapter/include/communicator", "${data_service_path}/adapter/include/utils", @@ -115,7 +114,7 @@ ohos_fuzztest("ObjectServiceStubFuzzTest") { "hisysevent:libhisysevent", "huks:libhukssdk", "ipc:ipc_core", - "json:nlohmann_json_static", + "cJSON:cjson", "kv_store:distributeddata_inner", "kv_store:distributeddata_mgr", ] diff --git a/services/distributeddataservice/service/test/fuzztest/rdbresultsetstub_fuzzer/BUILD.gn b/services/distributeddataservice/service/test/fuzztest/rdbresultsetstub_fuzzer/BUILD.gn index 984eddf37..a2c80dcfd 100644 --- a/services/distributeddataservice/service/test/fuzztest/rdbresultsetstub_fuzzer/BUILD.gn +++ b/services/distributeddataservice/service/test/fuzztest/rdbresultsetstub_fuzzer/BUILD.gn @@ -36,7 +36,6 @@ ohos_fuzztest("RdbResultSetStubFuzzTest") { "${relational_store_path}/interfaces/inner_api/cloud_data/include", "${relational_store_path}/interfaces/inner_api/rdb/include", "${relational_store_path}/interfaces/inner_api/common_type/include", - "//third_party/json/single_include", ] fuzz_config_file = diff --git a/services/distributeddataservice/service/test/fuzztest/rdbservicestub_fuzzer/BUILD.gn b/services/distributeddataservice/service/test/fuzztest/rdbservicestub_fuzzer/BUILD.gn index e9d34a5d4..44360e993 100644 --- a/services/distributeddataservice/service/test/fuzztest/rdbservicestub_fuzzer/BUILD.gn +++ b/services/distributeddataservice/service/test/fuzztest/rdbservicestub_fuzzer/BUILD.gn @@ -47,7 +47,6 @@ ohos_fuzztest("RdbServiceStubFuzzTest") { "${relational_store_path}/interfaces/inner_api/cloud_data/include", "${relational_store_path}/interfaces/inner_api/rdb/include", "${relational_store_path}/interfaces/inner_api/common_type/include", - "//third_party/json/single_include", "${data_service_path}/adapter/include/communicator", ] -- Gitee From 8ed3a2f57551175886cf12e3c5c765a34ae385a2 Mon Sep 17 00:00:00 2001 From: bjd Date: Mon, 12 May 2025 19:49:24 +0800 Subject: [PATCH 2/4] =?UTF-8?q?json=E6=94=B9=E4=B8=BAcjson?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: bjd --- .../framework/test/subscription_test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/distributeddataservice/framework/test/subscription_test.cpp b/services/distributeddataservice/framework/test/subscription_test.cpp index 00cffdd43..2b70c8a07 100644 --- a/services/distributeddataservice/framework/test/subscription_test.cpp +++ b/services/distributeddataservice/framework/test/subscription_test.cpp @@ -58,8 +58,8 @@ HWTEST_F(SubscriptionTest, RelationUnmarshal, TestSize.Level1) Subscription::json node; node["id"] = "testId"; node["bundleName"] = "testBundleName"; - node["relations"] = testRelation; Subscription::Relation relation; + relation.SetRelations(node["relations"], testRelation); relation.Unmarshal(node); ASSERT_EQ(relation.id, "testId"); ASSERT_EQ(relation.bundleName, "testBundleName"); @@ -94,8 +94,8 @@ HWTEST_F(SubscriptionTest, Unmarshal, TestSize.Level1) Subscription::json node; node["userId"] = 100; node["id"] = "testId"; - node["expiresTime"] = testExpiresTime; Subscription subscription; + subscription.SetSubscriptions(node["expiresTime"], testExpiresTime); subscription.Unmarshal(node); ASSERT_EQ(subscription.userId, 100); ASSERT_EQ(subscription.id, "testId"); -- Gitee From 1e51f87900027d1a643b07edba5ab57016063510 Mon Sep 17 00:00:00 2001 From: bjd Date: Mon, 12 May 2025 19:57:54 +0800 Subject: [PATCH 3/4] =?UTF-8?q?json=E6=94=B9=E4=B8=BAcjson?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: bjd --- .../distributeddataservice/framework/test/meta_data_test.cpp | 4 +++- .../service/test/data_share_profile_config_test.cpp | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/services/distributeddataservice/framework/test/meta_data_test.cpp b/services/distributeddataservice/framework/test/meta_data_test.cpp index f36343c3e..4ae6ed71e 100644 --- a/services/distributeddataservice/framework/test/meta_data_test.cpp +++ b/services/distributeddataservice/framework/test/meta_data_test.cpp @@ -736,7 +736,9 @@ HWTEST_F(ServiceMetaDataTest, UserMetaData, TestSize.Level1) Serializable::json node2; userStatus.Marshal(node2); - EXPECT_EQ(node2["isActive"], true); + bool ret; + node2["isActive"].get_to(ret); + EXPECT_EQ(ret, true); EXPECT_EQ(node2["id"], USER_ID2); UserStatus userUnmarshal; diff --git a/services/distributeddataservice/service/test/data_share_profile_config_test.cpp b/services/distributeddataservice/service/test/data_share_profile_config_test.cpp index 55f5a31b9..c7d227241 100644 --- a/services/distributeddataservice/service/test/data_share_profile_config_test.cpp +++ b/services/distributeddataservice/service/test/data_share_profile_config_test.cpp @@ -113,7 +113,9 @@ HWTEST_F(DataShareProfileConfigTest, ProfileInfo001, TestSize.Level1) Serializable::json node; info.Marshal(node); - EXPECT_EQ(node["isSilentProxyEnable"], true); + bool ret; + node["isSilentProxyEnable"].get_to(ret); + EXPECT_EQ(ret, true); EXPECT_EQ(node["path"], "storeName/tableName"); EXPECT_EQ(node["scope"], "module"); EXPECT_EQ(node["type"], "rdb"); -- Gitee From 82295364a8102de71eec056435176e834f46ac29 Mon Sep 17 00:00:00 2001 From: bjd Date: Mon, 19 May 2025 21:34:28 +0800 Subject: [PATCH 4/4] =?UTF-8?q?cjson=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: bjd --- .../include/serializable/serializable.h | 3 + .../framework/serializable/serializable.cpp | 110 +++++++++++++++--- 2 files changed, 100 insertions(+), 13 deletions(-) diff --git a/services/distributeddataservice/framework/include/serializable/serializable.h b/services/distributeddataservice/framework/include/serializable/serializable.h index a85451289..df04dfa11 100644 --- a/services/distributeddataservice/framework/include/serializable/serializable.h +++ b/services/distributeddataservice/framework/include/serializable/serializable.h @@ -101,6 +101,8 @@ public: API_EXPORT bool empty() const; API_EXPORT JSONWrapper& operator=(const std::map& value); API_EXPORT JSONWrapper &operator=(const std::map& value); + API_EXPORT bool erase(const std::string& key); + API_EXPORT bool erase(int index); private: void AddToRoot(); JSONWrapper(const JSONWrapper& jsonWrapper) = delete; @@ -154,6 +156,7 @@ public: API_EXPORT static bool GetValue(const json &node, const std::string &name, bool &value); API_EXPORT static bool GetValue(const json &node, const std::string &name, std::vector &value); API_EXPORT static bool GetValue(const json &node, const std::string &name, Serializable &value); + API_EXPORT static bool GetValue(const json &node, const std::string &name, double &value); API_EXPORT static bool SetValue(json &node, const std::string &value); API_EXPORT static bool SetValue(json &node, const uint32_t &value); API_EXPORT static bool SetValue(json &node, const int32_t &value); diff --git a/services/distributeddataservice/framework/serializable/serializable.cpp b/services/distributeddataservice/framework/serializable/serializable.cpp index 14f0b6431..0e1959748 100644 --- a/services/distributeddataservice/framework/serializable/serializable.cpp +++ b/services/distributeddataservice/framework/serializable/serializable.cpp @@ -163,6 +163,16 @@ bool Serializable::GetValue(const json &node, const std::string &name, Serializa return value.Unmarshal(subNode); } +bool Serializable::GetValue(const json &node, const std::string &name, double &value) +{ + auto &subNode = GetSubNode(node, name); + if (subNode.is_null() || !subNode.is_number_integer()) { + return false; + } + subNode.get_to(value); + return true; +} + bool Serializable::SetValue(json &node, const std::string &value) { node = value; @@ -309,17 +319,42 @@ Serializable::JSONWrapper &Serializable::JSONWrapper::operator=(bool value) cJSON_Delete(json_); json_ = nullptr; } - if (json_ != nullptr) { - if (cJSON_IsBool(json_)) { - cJSON_SetBoolValue(json_, value); + if (json_ == nullptr) { + json_ = cJSON_CreateBool(value); + if (json_ == nullptr || root_ == nullptr) { + return *this; } + AddToRoot(); + } + if (json_ == nullptr) { return *this; } - json_ = cJSON_CreateBool(value); - if (json_ == nullptr || root_ == nullptr) { + if (cJSON_IsBool(json_)) { + cJSON_SetBoolValue(json_, value); return *this; } - AddToRoot(); + cJSON *node = cJSON_CreateBool(value); + if (node == nullptr) { + return *this; + } + if (root_ == nullptr) { + cJSON_Delete(json_); + json_ = node; + return *this; + } + bool success = false; + if (key_.empty()) { + success = cJSON_ReplaceItemViaPointer(root_, json_, node); + } else { + success = cJSON_ReplaceItemInObject(root_, key_.c_str(), node); + } + if (!success) { + cJSON_Delete(node); + node = nullptr; + return *this; + } + json_ = node; + node = nullptr; return *this; } @@ -403,14 +438,43 @@ Serializable::JSONWrapper &Serializable::JSONWrapper::operator=(const char *valu cJSON_Delete(json_); json_ = nullptr; } - if (json_ != nullptr) { + + if (json_ == nullptr) { + json_ = cJSON_CreateString(value); + if (json_ == nullptr || root_ == nullptr) { + return *this; + } + AddToRoot(); + } + if (cJSON_IsString(json_)) { + cJSON_SetValuestring(json_, value); return *this; } - json_ = cJSON_CreateString(value); - if (json_ == nullptr || root_ == nullptr) { + + cJSON *node = cJSON_CreateString(value); + if (node == nullptr) { return *this; } - AddToRoot(); + if (root_ == nullptr) { + cJSON_Delete(json_); + json_ = node; + } else { + bool success = false; + if (key_.empty()) { + success = cJSON_ReplaceItemViaPointer(root_, json_, node); + } else { + success = cJSON_ReplaceItemInObject(root_, key_.c_str(), node); + } + + if (!success) { + cJSON_Delete(node); + node = nullptr; + return *this; + } + + json_ = node; + node = nullptr; + } return *this; } @@ -724,7 +788,7 @@ Serializable::iterator Serializable::JSONWrapper::find(const std::string &key) c children_.clear(); for (int i = 0; i < size; i++) { auto item = cJSON_GetArrayItem(json_, i); - children_.push_back(std::make_shared(item, json_, item != nullptr ? item->string : "")); + children_.push_back(std::make_shared(item, json_, is_object() ? item->string:"")); } } auto it = children_.begin(); @@ -749,7 +813,7 @@ Serializable::iterator Serializable::JSONWrapper::begin() const children_.clear(); for (int i = 0; i < size; i++) { auto item = cJSON_GetArrayItem(json_, i); - children_.push_back(std::make_shared(item, json_, item != nullptr ? item->string : "")); + children_.push_back(std::make_shared(item, json_, is_object() ? item->string:"")); } } return children_.begin(); @@ -767,7 +831,7 @@ Serializable::iterator Serializable::JSONWrapper::end() const children_.clear(); for (int i = 0; i < size; i++) { auto item = cJSON_GetArrayItem(json_, i); - children_.push_back(std::make_shared(item, json_, item != nullptr ? item->string : "")); + children_.push_back(std::make_shared(item, json_, is_object() ? item->string:"")); } } return children_.end(); @@ -941,5 +1005,25 @@ Serializable::JSONWrapper& Serializable::JSONWrapper::operator=(const std::map