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