153c3577eSopenharmony_ci/* 253c3577eSopenharmony_ci * Copyright (c) 2021 Huawei Device Co., Ltd. 353c3577eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 453c3577eSopenharmony_ci * you may not use this file except in compliance with the License. 553c3577eSopenharmony_ci * You may obtain a copy of the License at 653c3577eSopenharmony_ci * 753c3577eSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 853c3577eSopenharmony_ci * 953c3577eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 1053c3577eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 1153c3577eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1253c3577eSopenharmony_ci * See the License for the specific language governing permissions and 1353c3577eSopenharmony_ci * limitations under the License. 1453c3577eSopenharmony_ci */ 1553c3577eSopenharmony_ci 1653c3577eSopenharmony_ci#include "serializable/serializable.h" 1753c3577eSopenharmony_cinamespace OHOS { 1853c3577eSopenharmony_cinamespace DistributedData { 1953c3577eSopenharmony_ciSerializable::json Serializable::Marshall() const 2053c3577eSopenharmony_ci{ 2153c3577eSopenharmony_ci json root; 2253c3577eSopenharmony_ci Marshal(root); 2353c3577eSopenharmony_ci return root; 2453c3577eSopenharmony_ci} 2553c3577eSopenharmony_ci 2653c3577eSopenharmony_cibool Serializable::Unmarshall(const std::string &jsonStr) 2753c3577eSopenharmony_ci{ 2853c3577eSopenharmony_ci json jsonObj = json::parse(jsonStr, nullptr, false); 2953c3577eSopenharmony_ci if (jsonObj.is_discarded()) { 3053c3577eSopenharmony_ci // if the string size is less than 1, means the string is invalid. 3153c3577eSopenharmony_ci if (jsonStr.empty()) { 3253c3577eSopenharmony_ci return false; 3353c3577eSopenharmony_ci } 3453c3577eSopenharmony_ci jsonObj = json::parse(jsonStr.substr(1), nullptr, false); // drop first char to adapt A's value; 3553c3577eSopenharmony_ci if (jsonObj.is_discarded()) { 3653c3577eSopenharmony_ci return false; 3753c3577eSopenharmony_ci } 3853c3577eSopenharmony_ci } 3953c3577eSopenharmony_ci return Unmarshal(jsonObj); 4053c3577eSopenharmony_ci} 4153c3577eSopenharmony_ci 4253c3577eSopenharmony_ciSerializable::json Serializable::ToJson(const std::string &jsonStr) 4353c3577eSopenharmony_ci{ 4453c3577eSopenharmony_ci json jsonObj = json::parse(jsonStr, nullptr, false); 4553c3577eSopenharmony_ci if (jsonObj.is_discarded()) { 4653c3577eSopenharmony_ci // if the string size is less than 1, means the string is invalid. 4753c3577eSopenharmony_ci if (jsonStr.empty()) { 4853c3577eSopenharmony_ci return {}; 4953c3577eSopenharmony_ci } 5053c3577eSopenharmony_ci jsonObj = json::parse(jsonStr.substr(1), nullptr, false); // drop first char to adapt A's value; 5153c3577eSopenharmony_ci if (jsonObj.is_discarded()) { 5253c3577eSopenharmony_ci return {}; 5353c3577eSopenharmony_ci } 5453c3577eSopenharmony_ci } 5553c3577eSopenharmony_ci return jsonObj; 5653c3577eSopenharmony_ci} 5753c3577eSopenharmony_ci 5853c3577eSopenharmony_cibool Serializable::IsJson(const std::string &jsonStr) 5953c3577eSopenharmony_ci{ 6053c3577eSopenharmony_ci if (!json::accept(jsonStr)) { 6153c3577eSopenharmony_ci return json::accept(jsonStr.begin() + 1, jsonStr.end()); 6253c3577eSopenharmony_ci } 6353c3577eSopenharmony_ci return true; 6453c3577eSopenharmony_ci} 6553c3577eSopenharmony_ci 6653c3577eSopenharmony_cibool Serializable::GetValue(const json &node, const std::string &name, std::string &value) 6753c3577eSopenharmony_ci{ 6853c3577eSopenharmony_ci auto &subNode = GetSubNode(node, name); 6953c3577eSopenharmony_ci if (subNode.is_null() || !subNode.is_string()) { 7053c3577eSopenharmony_ci return false; 7153c3577eSopenharmony_ci } 7253c3577eSopenharmony_ci value = subNode; 7353c3577eSopenharmony_ci return true; 7453c3577eSopenharmony_ci} 7553c3577eSopenharmony_ci 7653c3577eSopenharmony_cibool Serializable::GetValue(const json &node, const std::string &name, uint32_t &value) 7753c3577eSopenharmony_ci{ 7853c3577eSopenharmony_ci auto &subNode = GetSubNode(node, name); 7953c3577eSopenharmony_ci if (subNode.is_null() || !subNode.is_number_unsigned()) { 8053c3577eSopenharmony_ci return false; 8153c3577eSopenharmony_ci } 8253c3577eSopenharmony_ci subNode.get_to(value); 8353c3577eSopenharmony_ci return true; 8453c3577eSopenharmony_ci} 8553c3577eSopenharmony_ci 8653c3577eSopenharmony_cibool Serializable::GetValue(const json &node, const std::string &name, int32_t &value) 8753c3577eSopenharmony_ci{ 8853c3577eSopenharmony_ci auto &subNode = GetSubNode(node, name); 8953c3577eSopenharmony_ci if (subNode.is_null() || !subNode.is_number_integer()) { 9053c3577eSopenharmony_ci return false; 9153c3577eSopenharmony_ci } 9253c3577eSopenharmony_ci subNode.get_to(value); 9353c3577eSopenharmony_ci return true; 9453c3577eSopenharmony_ci} 9553c3577eSopenharmony_ci 9653c3577eSopenharmony_cibool Serializable::GetValue(const json &node, const std::string &name, int64_t &value) 9753c3577eSopenharmony_ci{ 9853c3577eSopenharmony_ci auto &subNode = GetSubNode(node, name); 9953c3577eSopenharmony_ci if (subNode.is_null() || !subNode.is_number_integer()) { 10053c3577eSopenharmony_ci return false; 10153c3577eSopenharmony_ci } 10253c3577eSopenharmony_ci subNode.get_to(value); 10353c3577eSopenharmony_ci return true; 10453c3577eSopenharmony_ci} 10553c3577eSopenharmony_ci 10653c3577eSopenharmony_cibool Serializable::GetValue(const json &node, const std::string &name, uint64_t &value) 10753c3577eSopenharmony_ci{ 10853c3577eSopenharmony_ci auto &subNode = GetSubNode(node, name); 10953c3577eSopenharmony_ci if (subNode.is_null() || !subNode.is_number_unsigned()) { 11053c3577eSopenharmony_ci return false; 11153c3577eSopenharmony_ci } 11253c3577eSopenharmony_ci subNode.get_to(value); 11353c3577eSopenharmony_ci return true; 11453c3577eSopenharmony_ci} 11553c3577eSopenharmony_ci 11653c3577eSopenharmony_cibool Serializable::GetValue(const json &node, const std::string &name, uint16_t &value) 11753c3577eSopenharmony_ci{ 11853c3577eSopenharmony_ci auto &subNode = GetSubNode(node, name); 11953c3577eSopenharmony_ci if (subNode.is_null() || !subNode.is_number_unsigned()) { 12053c3577eSopenharmony_ci return false; 12153c3577eSopenharmony_ci } 12253c3577eSopenharmony_ci subNode.get_to(value); 12353c3577eSopenharmony_ci return true; 12453c3577eSopenharmony_ci} 12553c3577eSopenharmony_ci 12653c3577eSopenharmony_cibool Serializable::GetValue(const json &node, const std::string &name, bool &value) 12753c3577eSopenharmony_ci{ 12853c3577eSopenharmony_ci auto &subNode = GetSubNode(node, name); 12953c3577eSopenharmony_ci if (subNode.is_boolean()) { 13053c3577eSopenharmony_ci subNode.get_to(value); 13153c3577eSopenharmony_ci return true; 13253c3577eSopenharmony_ci } 13353c3577eSopenharmony_ci 13453c3577eSopenharmony_ci if (subNode.is_number_unsigned()) { 13553c3577eSopenharmony_ci uint32_t number = 0; 13653c3577eSopenharmony_ci subNode.get_to(number); 13753c3577eSopenharmony_ci value = number != 0; 13853c3577eSopenharmony_ci return true; 13953c3577eSopenharmony_ci } 14053c3577eSopenharmony_ci 14153c3577eSopenharmony_ci return false; 14253c3577eSopenharmony_ci} 14353c3577eSopenharmony_ci 14453c3577eSopenharmony_cibool Serializable::GetValue(const json &node, const std::string &name, std::vector<uint8_t> &value) 14553c3577eSopenharmony_ci{ 14653c3577eSopenharmony_ci auto &subNode = GetSubNode(node, name); 14753c3577eSopenharmony_ci if (subNode.is_null() || !subNode.is_array()) { 14853c3577eSopenharmony_ci return false; 14953c3577eSopenharmony_ci } 15053c3577eSopenharmony_ci value = std::vector<uint8_t>(subNode); 15153c3577eSopenharmony_ci return true; 15253c3577eSopenharmony_ci} 15353c3577eSopenharmony_ci 15453c3577eSopenharmony_cibool Serializable::GetValue(const json &node, const std::string &name, Serializable &value) 15553c3577eSopenharmony_ci{ 15653c3577eSopenharmony_ci auto &subNode = GetSubNode(node, name); 15753c3577eSopenharmony_ci if (subNode.is_null() || !subNode.is_object()) { 15853c3577eSopenharmony_ci return false; 15953c3577eSopenharmony_ci } 16053c3577eSopenharmony_ci return value.Unmarshal(subNode); 16153c3577eSopenharmony_ci} 16253c3577eSopenharmony_ci 16353c3577eSopenharmony_cibool Serializable::SetValue(json &node, const std::string &value) 16453c3577eSopenharmony_ci{ 16553c3577eSopenharmony_ci node = value; 16653c3577eSopenharmony_ci return true; 16753c3577eSopenharmony_ci} 16853c3577eSopenharmony_ci 16953c3577eSopenharmony_cibool Serializable::SetValue(json &node, const uint32_t &value) 17053c3577eSopenharmony_ci{ 17153c3577eSopenharmony_ci node = value; 17253c3577eSopenharmony_ci return true; 17353c3577eSopenharmony_ci} 17453c3577eSopenharmony_ci 17553c3577eSopenharmony_cibool Serializable::SetValue(json &node, const int32_t &value) 17653c3577eSopenharmony_ci{ 17753c3577eSopenharmony_ci node = value; 17853c3577eSopenharmony_ci return true; 17953c3577eSopenharmony_ci} 18053c3577eSopenharmony_ci 18153c3577eSopenharmony_cibool Serializable::SetValue(json &node, const int64_t &value) 18253c3577eSopenharmony_ci{ 18353c3577eSopenharmony_ci node = value; 18453c3577eSopenharmony_ci return true; 18553c3577eSopenharmony_ci} 18653c3577eSopenharmony_ci 18753c3577eSopenharmony_cibool Serializable::SetValue(json &node, const double &value) 18853c3577eSopenharmony_ci{ 18953c3577eSopenharmony_ci node = value; 19053c3577eSopenharmony_ci return true; 19153c3577eSopenharmony_ci} 19253c3577eSopenharmony_ci 19353c3577eSopenharmony_cibool Serializable::SetValue(json &node, const uint64_t &value) 19453c3577eSopenharmony_ci{ 19553c3577eSopenharmony_ci node = value; 19653c3577eSopenharmony_ci return true; 19753c3577eSopenharmony_ci} 19853c3577eSopenharmony_ci 19953c3577eSopenharmony_cibool Serializable::SetValue(json &node, const uint16_t &value) 20053c3577eSopenharmony_ci{ 20153c3577eSopenharmony_ci node = value; 20253c3577eSopenharmony_ci return true; 20353c3577eSopenharmony_ci} 20453c3577eSopenharmony_ci 20553c3577eSopenharmony_cibool Serializable::SetValue(json &node, const std::vector<uint8_t> &value) 20653c3577eSopenharmony_ci{ 20753c3577eSopenharmony_ci node = value; 20853c3577eSopenharmony_ci return true; 20953c3577eSopenharmony_ci} 21053c3577eSopenharmony_ci 21153c3577eSopenharmony_cibool Serializable::SetValue(json &node, const Serializable &value) 21253c3577eSopenharmony_ci{ 21353c3577eSopenharmony_ci return value.Marshal(node); 21453c3577eSopenharmony_ci} 21553c3577eSopenharmony_ci 21653c3577eSopenharmony_ciconst Serializable::json &Serializable::GetSubNode(const json &node, const std::string &name) 21753c3577eSopenharmony_ci{ 21853c3577eSopenharmony_ci static const json jsonNull = json::value_t::null; 21953c3577eSopenharmony_ci if (node.is_discarded() || node.is_null()) { 22053c3577eSopenharmony_ci return jsonNull; 22153c3577eSopenharmony_ci } 22253c3577eSopenharmony_ci 22353c3577eSopenharmony_ci if (name.empty()) { 22453c3577eSopenharmony_ci return node; 22553c3577eSopenharmony_ci } 22653c3577eSopenharmony_ci 22753c3577eSopenharmony_ci auto it = node.find(name); 22853c3577eSopenharmony_ci if (it == node.end()) { 22953c3577eSopenharmony_ci return jsonNull; 23053c3577eSopenharmony_ci } 23153c3577eSopenharmony_ci return *it; 23253c3577eSopenharmony_ci} 23353c3577eSopenharmony_ci} // namespace DistributedData 23453c3577eSopenharmony_ci} // namespace OHOS 235