17c804472Sopenharmony_ci/*
27c804472Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
37c804472Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
47c804472Sopenharmony_ci * you may not use this file except in compliance with the License.
57c804472Sopenharmony_ci * You may obtain a copy of the License at
67c804472Sopenharmony_ci *
77c804472Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
87c804472Sopenharmony_ci *
97c804472Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
107c804472Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
117c804472Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127c804472Sopenharmony_ci * See the License for the specific language governing permissions and
137c804472Sopenharmony_ci * limitations under the License.
147c804472Sopenharmony_ci */
157c804472Sopenharmony_ci
167c804472Sopenharmony_ci#include "JsonReader.h"
177c804472Sopenharmony_ci
187c804472Sopenharmony_ci#include <fstream>
197c804472Sopenharmony_ci#include <sstream>
207c804472Sopenharmony_ci#include <limits>
217c804472Sopenharmony_ci#include <cstdint>
227c804472Sopenharmony_ci#include "PreviewerEngineLog.h"
237c804472Sopenharmony_ci#include "cJSON.h"
247c804472Sopenharmony_ci
257c804472Sopenharmony_cinamespace Json2 {
267c804472Sopenharmony_ci    Value::Value(cJSON* object) : jsonPtr(object), rootNode(true) {}
277c804472Sopenharmony_ci
287c804472Sopenharmony_ci    Value::Value(cJSON* object, bool isRoot) : jsonPtr(object), rootNode(isRoot) {}
297c804472Sopenharmony_ci
307c804472Sopenharmony_ci    Value::~Value()
317c804472Sopenharmony_ci    {
327c804472Sopenharmony_ci        if (!jsonPtr) {
337c804472Sopenharmony_ci            return;
347c804472Sopenharmony_ci        }
357c804472Sopenharmony_ci        if (rootNode) {
367c804472Sopenharmony_ci            cJSON_Delete(jsonPtr);
377c804472Sopenharmony_ci        }
387c804472Sopenharmony_ci        jsonPtr = nullptr;
397c804472Sopenharmony_ci    }
407c804472Sopenharmony_ci
417c804472Sopenharmony_ci    Value Value::operator[](const char* key)
427c804472Sopenharmony_ci    {
437c804472Sopenharmony_ci        if (!cJSON_HasObjectItem(jsonPtr, key)) {
447c804472Sopenharmony_ci            return Value();
457c804472Sopenharmony_ci        }
467c804472Sopenharmony_ci        return Value(cJSON_GetObjectItemCaseSensitive(jsonPtr, key), false);
477c804472Sopenharmony_ci    }
487c804472Sopenharmony_ci
497c804472Sopenharmony_ci    const Value Value::operator[](const char* key) const
507c804472Sopenharmony_ci    {
517c804472Sopenharmony_ci        if (!cJSON_HasObjectItem(jsonPtr, key)) {
527c804472Sopenharmony_ci            return Value();
537c804472Sopenharmony_ci        }
547c804472Sopenharmony_ci        return Value(cJSON_GetObjectItemCaseSensitive(jsonPtr, key), false);
557c804472Sopenharmony_ci    }
567c804472Sopenharmony_ci
577c804472Sopenharmony_ci    Value Value::operator[](const std::string& key)
587c804472Sopenharmony_ci    {
597c804472Sopenharmony_ci        if (!cJSON_HasObjectItem(jsonPtr, key.c_str())) {
607c804472Sopenharmony_ci            return Value();
617c804472Sopenharmony_ci        }
627c804472Sopenharmony_ci        return Value(cJSON_GetObjectItemCaseSensitive(jsonPtr, key.c_str()), false);
637c804472Sopenharmony_ci    }
647c804472Sopenharmony_ci
657c804472Sopenharmony_ci    const Value Value::operator[](const std::string& key) const
667c804472Sopenharmony_ci    {
677c804472Sopenharmony_ci        if (!cJSON_HasObjectItem(jsonPtr, key.c_str())) {
687c804472Sopenharmony_ci            return Value();
697c804472Sopenharmony_ci        }
707c804472Sopenharmony_ci        return Value(cJSON_GetObjectItemCaseSensitive(jsonPtr, key.c_str()), false);
717c804472Sopenharmony_ci    }
727c804472Sopenharmony_ci
737c804472Sopenharmony_ci    Value::Members Value::GetMemberNames() const
747c804472Sopenharmony_ci    {
757c804472Sopenharmony_ci        Members names;
767c804472Sopenharmony_ci        if (jsonPtr) {
777c804472Sopenharmony_ci            cJSON* item = jsonPtr->child;
787c804472Sopenharmony_ci            while (item != nullptr) {
797c804472Sopenharmony_ci                names.push_back(item->string);
807c804472Sopenharmony_ci                item = item->next;
817c804472Sopenharmony_ci            }
827c804472Sopenharmony_ci        }
837c804472Sopenharmony_ci        return names;
847c804472Sopenharmony_ci    }
857c804472Sopenharmony_ci
867c804472Sopenharmony_ci    std::string Value::ToString() const
877c804472Sopenharmony_ci    {
887c804472Sopenharmony_ci        std::string ret;
897c804472Sopenharmony_ci        if (!jsonPtr) {
907c804472Sopenharmony_ci            return ret;
917c804472Sopenharmony_ci        }
927c804472Sopenharmony_ci        char* jsonData = cJSON_PrintUnformatted(jsonPtr);
937c804472Sopenharmony_ci        if (jsonData) {
947c804472Sopenharmony_ci            ret = jsonData;
957c804472Sopenharmony_ci            cJSON_free(jsonData);
967c804472Sopenharmony_ci        }
977c804472Sopenharmony_ci        return ret;
987c804472Sopenharmony_ci    }
997c804472Sopenharmony_ci
1007c804472Sopenharmony_ci    std::string Value::ToStyledString() const
1017c804472Sopenharmony_ci    {
1027c804472Sopenharmony_ci        std::string ret;
1037c804472Sopenharmony_ci        if (!jsonPtr) {
1047c804472Sopenharmony_ci            return ret;
1057c804472Sopenharmony_ci        }
1067c804472Sopenharmony_ci        char* jsonData = cJSON_Print(jsonPtr);
1077c804472Sopenharmony_ci        if (jsonData) {
1087c804472Sopenharmony_ci            ret = jsonData;
1097c804472Sopenharmony_ci            cJSON_free(jsonData);
1107c804472Sopenharmony_ci        }
1117c804472Sopenharmony_ci        return ret;
1127c804472Sopenharmony_ci    }
1137c804472Sopenharmony_ci
1147c804472Sopenharmony_ci    const cJSON* Value::GetJsonPtr() const
1157c804472Sopenharmony_ci    {
1167c804472Sopenharmony_ci        return jsonPtr;
1177c804472Sopenharmony_ci    }
1187c804472Sopenharmony_ci
1197c804472Sopenharmony_ci    bool Value::IsNull() const
1207c804472Sopenharmony_ci    {
1217c804472Sopenharmony_ci        return !jsonPtr || cJSON_IsNull(jsonPtr);
1227c804472Sopenharmony_ci    }
1237c804472Sopenharmony_ci
1247c804472Sopenharmony_ci    bool Value::IsValid() const
1257c804472Sopenharmony_ci    {
1267c804472Sopenharmony_ci        return jsonPtr && !cJSON_IsInvalid(jsonPtr);
1277c804472Sopenharmony_ci    }
1287c804472Sopenharmony_ci
1297c804472Sopenharmony_ci    bool Value::IsNumber() const
1307c804472Sopenharmony_ci    {
1317c804472Sopenharmony_ci        return cJSON_IsNumber(jsonPtr);
1327c804472Sopenharmony_ci    }
1337c804472Sopenharmony_ci
1347c804472Sopenharmony_ci    bool Value::IsInt() const
1357c804472Sopenharmony_ci    {
1367c804472Sopenharmony_ci        if (!IsNumber()) {
1377c804472Sopenharmony_ci            return false;
1387c804472Sopenharmony_ci        }
1397c804472Sopenharmony_ci        double num = cJSON_GetNumberValue(jsonPtr);
1407c804472Sopenharmony_ci        return (num >= static_cast<double>(std::numeric_limits<int32_t>::min())) &&
1417c804472Sopenharmony_ci            (num <= static_cast<double>(std::numeric_limits<int32_t>::max()));
1427c804472Sopenharmony_ci    }
1437c804472Sopenharmony_ci
1447c804472Sopenharmony_ci    bool Value::IsUInt() const
1457c804472Sopenharmony_ci    {
1467c804472Sopenharmony_ci        if (!IsNumber()) {
1477c804472Sopenharmony_ci            return false;
1487c804472Sopenharmony_ci        }
1497c804472Sopenharmony_ci        double num = cJSON_GetNumberValue(jsonPtr);
1507c804472Sopenharmony_ci        return (num >= static_cast<double>(std::numeric_limits<uint32_t>::min())) &&
1517c804472Sopenharmony_ci            (num <= static_cast<double>(std::numeric_limits<uint32_t>::max()));
1527c804472Sopenharmony_ci    }
1537c804472Sopenharmony_ci
1547c804472Sopenharmony_ci    bool Value::IsInt64() const
1557c804472Sopenharmony_ci    {
1567c804472Sopenharmony_ci        if (!IsNumber()) {
1577c804472Sopenharmony_ci            return false;
1587c804472Sopenharmony_ci        }
1597c804472Sopenharmony_ci        double num = cJSON_GetNumberValue(jsonPtr);
1607c804472Sopenharmony_ci        return (num >= static_cast<double>(std::numeric_limits<int64_t>::min())) &&
1617c804472Sopenharmony_ci            (num <= static_cast<double>(std::numeric_limits<int64_t>::max()));
1627c804472Sopenharmony_ci    }
1637c804472Sopenharmony_ci
1647c804472Sopenharmony_ci    bool Value::IsUInt64() const
1657c804472Sopenharmony_ci    {
1667c804472Sopenharmony_ci        if (!IsNumber()) {
1677c804472Sopenharmony_ci            return false;
1687c804472Sopenharmony_ci        }
1697c804472Sopenharmony_ci        double num = cJSON_GetNumberValue(jsonPtr);
1707c804472Sopenharmony_ci        return (num >= static_cast<double>(std::numeric_limits<uint64_t>::min())) &&
1717c804472Sopenharmony_ci            (num <= static_cast<double>(std::numeric_limits<uint64_t>::max()));
1727c804472Sopenharmony_ci    }
1737c804472Sopenharmony_ci
1747c804472Sopenharmony_ci    bool Value::IsDouble() const
1757c804472Sopenharmony_ci    {
1767c804472Sopenharmony_ci        if (!IsNumber()) {
1777c804472Sopenharmony_ci            return false;
1787c804472Sopenharmony_ci        }
1797c804472Sopenharmony_ci        double num = cJSON_GetNumberValue(jsonPtr);
1807c804472Sopenharmony_ci        return (num >= std::numeric_limits<double>::lowest()) && (num <= std::numeric_limits<double>::max());
1817c804472Sopenharmony_ci    }
1827c804472Sopenharmony_ci
1837c804472Sopenharmony_ci    bool Value::IsBool() const
1847c804472Sopenharmony_ci    {
1857c804472Sopenharmony_ci        return cJSON_IsBool(jsonPtr);
1867c804472Sopenharmony_ci    }
1877c804472Sopenharmony_ci
1887c804472Sopenharmony_ci    bool Value::IsString() const
1897c804472Sopenharmony_ci    {
1907c804472Sopenharmony_ci        return cJSON_IsString(jsonPtr);
1917c804472Sopenharmony_ci    }
1927c804472Sopenharmony_ci
1937c804472Sopenharmony_ci    bool Value::IsObject() const
1947c804472Sopenharmony_ci    {
1957c804472Sopenharmony_ci        return cJSON_IsObject(jsonPtr);
1967c804472Sopenharmony_ci    }
1977c804472Sopenharmony_ci
1987c804472Sopenharmony_ci    bool Value::IsArray() const
1997c804472Sopenharmony_ci    {
2007c804472Sopenharmony_ci        return cJSON_IsArray(jsonPtr);
2017c804472Sopenharmony_ci    }
2027c804472Sopenharmony_ci
2037c804472Sopenharmony_ci    bool Value::IsMember(const char* key) const
2047c804472Sopenharmony_ci    {
2057c804472Sopenharmony_ci        return cJSON_HasObjectItem(jsonPtr, key);
2067c804472Sopenharmony_ci    }
2077c804472Sopenharmony_ci
2087c804472Sopenharmony_ci    int32_t Value::GetInt(const char* key, int32_t defaultVal) const
2097c804472Sopenharmony_ci    {
2107c804472Sopenharmony_ci        return static_cast<int32_t>(GetDouble(key, defaultVal));
2117c804472Sopenharmony_ci    }
2127c804472Sopenharmony_ci
2137c804472Sopenharmony_ci    uint32_t Value::GetUInt(const char* key, int32_t defaultVal) const
2147c804472Sopenharmony_ci    {
2157c804472Sopenharmony_ci        return static_cast<uint32_t>(GetDouble(key, defaultVal));
2167c804472Sopenharmony_ci    }
2177c804472Sopenharmony_ci
2187c804472Sopenharmony_ci    int64_t Value::GetInt64(const char* key, int32_t defaultVal) const
2197c804472Sopenharmony_ci    {
2207c804472Sopenharmony_ci        return static_cast<int64_t>(GetDouble(key, defaultVal));
2217c804472Sopenharmony_ci    }
2227c804472Sopenharmony_ci
2237c804472Sopenharmony_ci    float Value::GetFloat(const char* key, float defaultVal) const
2247c804472Sopenharmony_ci    {
2257c804472Sopenharmony_ci        return static_cast<float>(GetDouble(key, defaultVal));
2267c804472Sopenharmony_ci    }
2277c804472Sopenharmony_ci
2287c804472Sopenharmony_ci    double Value::GetDouble(const char* key, double defaultVal) const
2297c804472Sopenharmony_ci    {
2307c804472Sopenharmony_ci        Value val = GetValue(key);
2317c804472Sopenharmony_ci        if (!val.IsNull() && val.IsNumber()) {
2327c804472Sopenharmony_ci            return val.AsDouble();
2337c804472Sopenharmony_ci        }
2347c804472Sopenharmony_ci        return defaultVal;
2357c804472Sopenharmony_ci    }
2367c804472Sopenharmony_ci
2377c804472Sopenharmony_ci    bool Value::GetBool(const char* key, bool defaultVal) const
2387c804472Sopenharmony_ci    {
2397c804472Sopenharmony_ci        Value val = GetValue(key);
2407c804472Sopenharmony_ci        if (!val.IsNull() && val.IsBool()) {
2417c804472Sopenharmony_ci            return val.AsBool();
2427c804472Sopenharmony_ci        }
2437c804472Sopenharmony_ci        return defaultVal;
2447c804472Sopenharmony_ci    }
2457c804472Sopenharmony_ci
2467c804472Sopenharmony_ci    std::string Value::GetString(const char* key, const std::string defaultVal) const
2477c804472Sopenharmony_ci    {
2487c804472Sopenharmony_ci        Value val = GetValue(key);
2497c804472Sopenharmony_ci        if (!val.IsNull() && val.IsString()) {
2507c804472Sopenharmony_ci            return val.AsString();
2517c804472Sopenharmony_ci        }
2527c804472Sopenharmony_ci        return defaultVal;
2537c804472Sopenharmony_ci    }
2547c804472Sopenharmony_ci
2557c804472Sopenharmony_ci    Value Value::GetValue(const char* key) const
2567c804472Sopenharmony_ci    {
2577c804472Sopenharmony_ci        return Value(cJSON_GetObjectItemCaseSensitive(jsonPtr, key), false);
2587c804472Sopenharmony_ci    }
2597c804472Sopenharmony_ci
2607c804472Sopenharmony_ci    int32_t Value::AsInt() const
2617c804472Sopenharmony_ci    {
2627c804472Sopenharmony_ci        return static_cast<int32_t>(AsDouble());
2637c804472Sopenharmony_ci    }
2647c804472Sopenharmony_ci
2657c804472Sopenharmony_ci    uint32_t Value::AsUInt() const
2667c804472Sopenharmony_ci    {
2677c804472Sopenharmony_ci        return static_cast<uint32_t>(AsDouble());
2687c804472Sopenharmony_ci    }
2697c804472Sopenharmony_ci
2707c804472Sopenharmony_ci    int64_t Value::AsInt64() const
2717c804472Sopenharmony_ci    {
2727c804472Sopenharmony_ci        return static_cast<int64_t>(AsDouble());
2737c804472Sopenharmony_ci    }
2747c804472Sopenharmony_ci
2757c804472Sopenharmony_ci    float Value::AsFloat() const
2767c804472Sopenharmony_ci    {
2777c804472Sopenharmony_ci        return static_cast<float>(AsDouble());
2787c804472Sopenharmony_ci    }
2797c804472Sopenharmony_ci
2807c804472Sopenharmony_ci    double Value::AsDouble() const
2817c804472Sopenharmony_ci    {
2827c804472Sopenharmony_ci        if (jsonPtr && cJSON_IsNumber(jsonPtr)) {
2837c804472Sopenharmony_ci            return cJSON_GetNumberValue(jsonPtr);
2847c804472Sopenharmony_ci        }
2857c804472Sopenharmony_ci        return 0.0;
2867c804472Sopenharmony_ci    }
2877c804472Sopenharmony_ci
2887c804472Sopenharmony_ci    bool Value::AsBool() const
2897c804472Sopenharmony_ci    {
2907c804472Sopenharmony_ci        if (jsonPtr && cJSON_IsBool(jsonPtr)) {
2917c804472Sopenharmony_ci            return cJSON_IsTrue(jsonPtr);
2927c804472Sopenharmony_ci        }
2937c804472Sopenharmony_ci        return false;
2947c804472Sopenharmony_ci    }
2957c804472Sopenharmony_ci
2967c804472Sopenharmony_ci    std::string Value::AsString() const
2977c804472Sopenharmony_ci    {
2987c804472Sopenharmony_ci        if (jsonPtr && cJSON_IsString(jsonPtr)) {
2997c804472Sopenharmony_ci            return std::string(cJSON_GetStringValue(jsonPtr));
3007c804472Sopenharmony_ci        }
3017c804472Sopenharmony_ci        return "";
3027c804472Sopenharmony_ci    }
3037c804472Sopenharmony_ci
3047c804472Sopenharmony_ci
3057c804472Sopenharmony_ci    bool Value::Add(const char* key, const char* value)
3067c804472Sopenharmony_ci    {
3077c804472Sopenharmony_ci        if (!key || !cJSON_IsObject(jsonPtr)) {
3087c804472Sopenharmony_ci            return false;
3097c804472Sopenharmony_ci        }
3107c804472Sopenharmony_ci        cJSON* child = cJSON_CreateString(value);
3117c804472Sopenharmony_ci        if (child == nullptr) {
3127c804472Sopenharmony_ci            return false;
3137c804472Sopenharmony_ci        }
3147c804472Sopenharmony_ci        cJSON_AddItemToObject(jsonPtr, key, child);
3157c804472Sopenharmony_ci        return true;
3167c804472Sopenharmony_ci    }
3177c804472Sopenharmony_ci
3187c804472Sopenharmony_ci    bool Value::Add(const char* key, bool value)
3197c804472Sopenharmony_ci    {
3207c804472Sopenharmony_ci        if (!key || !cJSON_IsObject(jsonPtr)) {
3217c804472Sopenharmony_ci            return false;
3227c804472Sopenharmony_ci        }
3237c804472Sopenharmony_ci        cJSON* child = cJSON_CreateBool(static_cast<int>(value));
3247c804472Sopenharmony_ci        if (child == nullptr) {
3257c804472Sopenharmony_ci            return false;
3267c804472Sopenharmony_ci        }
3277c804472Sopenharmony_ci        cJSON_AddItemToObject(jsonPtr, key, child);
3287c804472Sopenharmony_ci        return true;
3297c804472Sopenharmony_ci    }
3307c804472Sopenharmony_ci
3317c804472Sopenharmony_ci    bool Value::Add(const char* key, int32_t value)
3327c804472Sopenharmony_ci    {
3337c804472Sopenharmony_ci        return Add(key, static_cast<double>(value));
3347c804472Sopenharmony_ci    }
3357c804472Sopenharmony_ci
3367c804472Sopenharmony_ci    bool Value::Add(const char* key, uint32_t value)
3377c804472Sopenharmony_ci    {
3387c804472Sopenharmony_ci        return Add(key, static_cast<double>(value));
3397c804472Sopenharmony_ci    }
3407c804472Sopenharmony_ci
3417c804472Sopenharmony_ci    bool Value::Add(const char* key, int64_t value)
3427c804472Sopenharmony_ci    {
3437c804472Sopenharmony_ci        return Add(key, static_cast<double>(value));
3447c804472Sopenharmony_ci    }
3457c804472Sopenharmony_ci
3467c804472Sopenharmony_ci    bool Value::Add(const char* key, double value)
3477c804472Sopenharmony_ci    {
3487c804472Sopenharmony_ci        if (!key || !cJSON_IsObject(jsonPtr)) {
3497c804472Sopenharmony_ci            return false;
3507c804472Sopenharmony_ci        }
3517c804472Sopenharmony_ci        cJSON* child = cJSON_CreateNumber(value);
3527c804472Sopenharmony_ci        if (child == nullptr) {
3537c804472Sopenharmony_ci            return false;
3547c804472Sopenharmony_ci        }
3557c804472Sopenharmony_ci        cJSON_AddItemToObject(jsonPtr, key, child);
3567c804472Sopenharmony_ci        return true;
3577c804472Sopenharmony_ci    }
3587c804472Sopenharmony_ci
3597c804472Sopenharmony_ci    bool Value::Add(const char* key, const Value& value)
3607c804472Sopenharmony_ci    {
3617c804472Sopenharmony_ci        if (!key || value.IsNull() || !value.IsValid()) {
3627c804472Sopenharmony_ci            return false;
3637c804472Sopenharmony_ci        }
3647c804472Sopenharmony_ci        cJSON* jsonObject = cJSON_Duplicate(const_cast<cJSON*>(value.GetJsonPtr()), true);
3657c804472Sopenharmony_ci        if (jsonObject == nullptr) {
3667c804472Sopenharmony_ci            return false;
3677c804472Sopenharmony_ci        }
3687c804472Sopenharmony_ci        cJSON_AddItemToObject(jsonPtr, key, jsonObject);
3697c804472Sopenharmony_ci        return true;
3707c804472Sopenharmony_ci    }
3717c804472Sopenharmony_ci
3727c804472Sopenharmony_ci    bool Value::Add(const char* value)
3737c804472Sopenharmony_ci    {
3747c804472Sopenharmony_ci        if (!cJSON_IsArray(jsonPtr)) {
3757c804472Sopenharmony_ci            return false;
3767c804472Sopenharmony_ci        }
3777c804472Sopenharmony_ci        cJSON* child = cJSON_CreateString(value);
3787c804472Sopenharmony_ci        if (child == nullptr) {
3797c804472Sopenharmony_ci            return false;
3807c804472Sopenharmony_ci        }
3817c804472Sopenharmony_ci        cJSON_AddItemToArray(jsonPtr, child);
3827c804472Sopenharmony_ci        return true;
3837c804472Sopenharmony_ci    }
3847c804472Sopenharmony_ci
3857c804472Sopenharmony_ci    bool Value::Add(bool value)
3867c804472Sopenharmony_ci    {
3877c804472Sopenharmony_ci        if (!cJSON_IsArray(jsonPtr)) {
3887c804472Sopenharmony_ci            return false;
3897c804472Sopenharmony_ci        }
3907c804472Sopenharmony_ci        cJSON* child = cJSON_CreateBool(static_cast<int>(value));
3917c804472Sopenharmony_ci        if (child == nullptr) {
3927c804472Sopenharmony_ci            return false;
3937c804472Sopenharmony_ci        }
3947c804472Sopenharmony_ci        cJSON_AddItemToArray(jsonPtr, child);
3957c804472Sopenharmony_ci        return true;
3967c804472Sopenharmony_ci    }
3977c804472Sopenharmony_ci
3987c804472Sopenharmony_ci    bool Value::Add(int32_t value)
3997c804472Sopenharmony_ci    {
4007c804472Sopenharmony_ci        return Add(static_cast<double>(value));
4017c804472Sopenharmony_ci    }
4027c804472Sopenharmony_ci
4037c804472Sopenharmony_ci    bool Value::Add(uint32_t value)
4047c804472Sopenharmony_ci    {
4057c804472Sopenharmony_ci        return Add(static_cast<double>(value));
4067c804472Sopenharmony_ci    }
4077c804472Sopenharmony_ci
4087c804472Sopenharmony_ci    bool Value::Add(int64_t value)
4097c804472Sopenharmony_ci    {
4107c804472Sopenharmony_ci        return Add(static_cast<double>(value));
4117c804472Sopenharmony_ci    }
4127c804472Sopenharmony_ci
4137c804472Sopenharmony_ci    bool Value::Add(double value)
4147c804472Sopenharmony_ci    {
4157c804472Sopenharmony_ci        if (!cJSON_IsArray(jsonPtr)) {
4167c804472Sopenharmony_ci            return false;
4177c804472Sopenharmony_ci        }
4187c804472Sopenharmony_ci        cJSON* child = cJSON_CreateNumber(value);
4197c804472Sopenharmony_ci        if (child == nullptr) {
4207c804472Sopenharmony_ci            return false;
4217c804472Sopenharmony_ci        }
4227c804472Sopenharmony_ci        cJSON_AddItemToArray(jsonPtr, child);
4237c804472Sopenharmony_ci        return true;
4247c804472Sopenharmony_ci    }
4257c804472Sopenharmony_ci
4267c804472Sopenharmony_ci
4277c804472Sopenharmony_ci    bool Value::Add(const Value& value)
4287c804472Sopenharmony_ci    {
4297c804472Sopenharmony_ci        if (value.IsNull() || !value.IsValid()) {
4307c804472Sopenharmony_ci            return false;
4317c804472Sopenharmony_ci        }
4327c804472Sopenharmony_ci        cJSON* jsonObject = cJSON_Duplicate(const_cast<cJSON*>(value.GetJsonPtr()), true);
4337c804472Sopenharmony_ci        if (jsonObject == nullptr) {
4347c804472Sopenharmony_ci            return false;
4357c804472Sopenharmony_ci        }
4367c804472Sopenharmony_ci        cJSON_AddItemToArray(jsonPtr, jsonObject);
4377c804472Sopenharmony_ci        return true;
4387c804472Sopenharmony_ci    }
4397c804472Sopenharmony_ci
4407c804472Sopenharmony_ci    bool Value::Replace(const char* key, bool value)
4417c804472Sopenharmony_ci    {
4427c804472Sopenharmony_ci        if (!key) {
4437c804472Sopenharmony_ci            return false;
4447c804472Sopenharmony_ci        }
4457c804472Sopenharmony_ci        cJSON* child = cJSON_CreateBool(static_cast<int>(value));
4467c804472Sopenharmony_ci        if (child == nullptr) {
4477c804472Sopenharmony_ci            return false;
4487c804472Sopenharmony_ci        }
4497c804472Sopenharmony_ci        if (!cJSON_ReplaceItemInObjectCaseSensitive(jsonPtr, key, child)) {
4507c804472Sopenharmony_ci            cJSON_Delete(child);
4517c804472Sopenharmony_ci            return false;
4527c804472Sopenharmony_ci        }
4537c804472Sopenharmony_ci        return true;
4547c804472Sopenharmony_ci    }
4557c804472Sopenharmony_ci
4567c804472Sopenharmony_ci    bool Value::Replace(const char* key, int32_t value)
4577c804472Sopenharmony_ci    {
4587c804472Sopenharmony_ci        return Replace(key, static_cast<double>(value));
4597c804472Sopenharmony_ci    }
4607c804472Sopenharmony_ci
4617c804472Sopenharmony_ci    bool Value::Replace(const char* key, uint32_t value)
4627c804472Sopenharmony_ci    {
4637c804472Sopenharmony_ci        return Replace(key, static_cast<double>(value));
4647c804472Sopenharmony_ci    }
4657c804472Sopenharmony_ci
4667c804472Sopenharmony_ci    bool Value::Replace(const char* key, int64_t value)
4677c804472Sopenharmony_ci    {
4687c804472Sopenharmony_ci        return Replace(key, static_cast<double>(value));
4697c804472Sopenharmony_ci    }
4707c804472Sopenharmony_ci
4717c804472Sopenharmony_ci    bool Value::Replace(const char* key, double value)
4727c804472Sopenharmony_ci    {
4737c804472Sopenharmony_ci        if (!key) {
4747c804472Sopenharmony_ci            return false;
4757c804472Sopenharmony_ci        }
4767c804472Sopenharmony_ci        cJSON* child = cJSON_CreateNumber(value);
4777c804472Sopenharmony_ci        if (child == nullptr) {
4787c804472Sopenharmony_ci            return false;
4797c804472Sopenharmony_ci        }
4807c804472Sopenharmony_ci        if (!cJSON_ReplaceItemInObjectCaseSensitive(jsonPtr, key, child)) {
4817c804472Sopenharmony_ci            cJSON_Delete(child);
4827c804472Sopenharmony_ci            return false;
4837c804472Sopenharmony_ci        }
4847c804472Sopenharmony_ci        return true;
4857c804472Sopenharmony_ci    }
4867c804472Sopenharmony_ci
4877c804472Sopenharmony_ci    bool Value::Replace(const char* key, const char* value)
4887c804472Sopenharmony_ci    {
4897c804472Sopenharmony_ci        if (!key) {
4907c804472Sopenharmony_ci            return false;
4917c804472Sopenharmony_ci        }
4927c804472Sopenharmony_ci        cJSON* child = cJSON_CreateString(value);
4937c804472Sopenharmony_ci        if (child == nullptr) {
4947c804472Sopenharmony_ci            return false;
4957c804472Sopenharmony_ci        }
4967c804472Sopenharmony_ci        if (!cJSON_ReplaceItemInObjectCaseSensitive(jsonPtr, key, child)) {
4977c804472Sopenharmony_ci            cJSON_Delete(child);
4987c804472Sopenharmony_ci            return false;
4997c804472Sopenharmony_ci        }
5007c804472Sopenharmony_ci        return true;
5017c804472Sopenharmony_ci    }
5027c804472Sopenharmony_ci
5037c804472Sopenharmony_ci    bool Value::Replace(const char* key, const Value& value)
5047c804472Sopenharmony_ci    {
5057c804472Sopenharmony_ci        if (!key) {
5067c804472Sopenharmony_ci            return false;
5077c804472Sopenharmony_ci        }
5087c804472Sopenharmony_ci        cJSON* jsonObject = cJSON_Duplicate(const_cast<cJSON*>(value.GetJsonPtr()), true);
5097c804472Sopenharmony_ci        if (jsonObject == nullptr) {
5107c804472Sopenharmony_ci            return false;
5117c804472Sopenharmony_ci        }
5127c804472Sopenharmony_ci
5137c804472Sopenharmony_ci        if (!cJSON_ReplaceItemInObjectCaseSensitive(jsonPtr, key, jsonObject)) {
5147c804472Sopenharmony_ci            cJSON_Delete(jsonObject);
5157c804472Sopenharmony_ci            return false;
5167c804472Sopenharmony_ci        }
5177c804472Sopenharmony_ci        return true;
5187c804472Sopenharmony_ci    }
5197c804472Sopenharmony_ci
5207c804472Sopenharmony_ci    bool Value::Replace(int index, bool value)
5217c804472Sopenharmony_ci    {
5227c804472Sopenharmony_ci        if (index < 0 || index >= GetArraySize()) {
5237c804472Sopenharmony_ci            return false;
5247c804472Sopenharmony_ci        }
5257c804472Sopenharmony_ci        cJSON* child = cJSON_CreateBool(static_cast<int>(value));
5267c804472Sopenharmony_ci        if (child == nullptr) {
5277c804472Sopenharmony_ci            return false;
5287c804472Sopenharmony_ci        }
5297c804472Sopenharmony_ci        if (!cJSON_ReplaceItemInArray(jsonPtr, index, child)) {
5307c804472Sopenharmony_ci            cJSON_Delete(child);
5317c804472Sopenharmony_ci            return false;
5327c804472Sopenharmony_ci        }
5337c804472Sopenharmony_ci        return true;
5347c804472Sopenharmony_ci    }
5357c804472Sopenharmony_ci
5367c804472Sopenharmony_ci    bool Value::Replace(int index, int32_t value)
5377c804472Sopenharmony_ci    {
5387c804472Sopenharmony_ci        return Replace(index, static_cast<double>(value));
5397c804472Sopenharmony_ci    }
5407c804472Sopenharmony_ci
5417c804472Sopenharmony_ci    bool Value::Replace(int index, uint32_t value)
5427c804472Sopenharmony_ci    {
5437c804472Sopenharmony_ci        return Replace(index, static_cast<double>(value));
5447c804472Sopenharmony_ci    }
5457c804472Sopenharmony_ci
5467c804472Sopenharmony_ci    bool Value::Replace(int index, int64_t value)
5477c804472Sopenharmony_ci    {
5487c804472Sopenharmony_ci        return Replace(index, static_cast<double>(value));
5497c804472Sopenharmony_ci    }
5507c804472Sopenharmony_ci
5517c804472Sopenharmony_ci    bool Value::Replace(int index, double value)
5527c804472Sopenharmony_ci    {
5537c804472Sopenharmony_ci        if (index < 0 || index >= GetArraySize()) {
5547c804472Sopenharmony_ci            return false;
5557c804472Sopenharmony_ci        }
5567c804472Sopenharmony_ci        cJSON* child = cJSON_CreateNumber(value);
5577c804472Sopenharmony_ci        if (child == nullptr) {
5587c804472Sopenharmony_ci            return false;
5597c804472Sopenharmony_ci        }
5607c804472Sopenharmony_ci        if (!cJSON_ReplaceItemInArray(jsonPtr, index, child)) {
5617c804472Sopenharmony_ci            cJSON_Delete(child);
5627c804472Sopenharmony_ci            return false;
5637c804472Sopenharmony_ci        }
5647c804472Sopenharmony_ci        return true;
5657c804472Sopenharmony_ci    }
5667c804472Sopenharmony_ci
5677c804472Sopenharmony_ci    bool Value::Replace(int index, const char* value)
5687c804472Sopenharmony_ci    {
5697c804472Sopenharmony_ci        if (index < 0 || index >= GetArraySize()) {
5707c804472Sopenharmony_ci            return false;
5717c804472Sopenharmony_ci        }
5727c804472Sopenharmony_ci        cJSON* child = cJSON_CreateString(value);
5737c804472Sopenharmony_ci        if (child == nullptr) {
5747c804472Sopenharmony_ci            return false;
5757c804472Sopenharmony_ci        }
5767c804472Sopenharmony_ci        if (!cJSON_ReplaceItemInArray(jsonPtr, index, child)) {
5777c804472Sopenharmony_ci            cJSON_Delete(child);
5787c804472Sopenharmony_ci            return false;
5797c804472Sopenharmony_ci        }
5807c804472Sopenharmony_ci        return true;
5817c804472Sopenharmony_ci    }
5827c804472Sopenharmony_ci
5837c804472Sopenharmony_ci    bool Value::Replace(int index, const Value& value)
5847c804472Sopenharmony_ci    {
5857c804472Sopenharmony_ci        if (index < 0 || index >= GetArraySize()) {
5867c804472Sopenharmony_ci            return false;
5877c804472Sopenharmony_ci        }
5887c804472Sopenharmony_ci        cJSON* jsonObject = cJSON_Duplicate(const_cast<cJSON*>(value.GetJsonPtr()), true);
5897c804472Sopenharmony_ci        if (jsonObject == nullptr) {
5907c804472Sopenharmony_ci            return false;
5917c804472Sopenharmony_ci        }
5927c804472Sopenharmony_ci
5937c804472Sopenharmony_ci        if (!cJSON_ReplaceItemInArray(jsonPtr, index, jsonObject)) {
5947c804472Sopenharmony_ci            cJSON_Delete(jsonObject);
5957c804472Sopenharmony_ci            return false;
5967c804472Sopenharmony_ci        }
5977c804472Sopenharmony_ci        return true;
5987c804472Sopenharmony_ci    }
5997c804472Sopenharmony_ci
6007c804472Sopenharmony_ci    uint32_t Value::GetArraySize() const
6017c804472Sopenharmony_ci    {
6027c804472Sopenharmony_ci        return cJSON_GetArraySize(jsonPtr);
6037c804472Sopenharmony_ci    }
6047c804472Sopenharmony_ci
6057c804472Sopenharmony_ci    Value Value::GetArrayItem(int32_t index) const
6067c804472Sopenharmony_ci    {
6077c804472Sopenharmony_ci        return Value(cJSON_GetArrayItem(jsonPtr, index), false);
6087c804472Sopenharmony_ci    }
6097c804472Sopenharmony_ci
6107c804472Sopenharmony_ci    void Value::Clear()
6117c804472Sopenharmony_ci    {
6127c804472Sopenharmony_ci        cJSON_Delete(jsonPtr);
6137c804472Sopenharmony_ci        jsonPtr = cJSON_CreateObject();
6147c804472Sopenharmony_ci    }
6157c804472Sopenharmony_ci
6167c804472Sopenharmony_ci    std::string Value::GetKey()
6177c804472Sopenharmony_ci    {
6187c804472Sopenharmony_ci        const char* key = jsonPtr->string;
6197c804472Sopenharmony_ci        if (key) {
6207c804472Sopenharmony_ci            return std::string(key);
6217c804472Sopenharmony_ci        }
6227c804472Sopenharmony_ci        return std::string();
6237c804472Sopenharmony_ci    }
6247c804472Sopenharmony_ci}
6257c804472Sopenharmony_ci
6267c804472Sopenharmony_ci
6277c804472Sopenharmony_cistd::string JsonReader::ReadFile(const std::string& path)
6287c804472Sopenharmony_ci{
6297c804472Sopenharmony_ci    std::ifstream inFile(path);
6307c804472Sopenharmony_ci    if (!inFile.is_open()) {
6317c804472Sopenharmony_ci        ELOG("JsonReader: Open json file failed.");
6327c804472Sopenharmony_ci        return std::string();
6337c804472Sopenharmony_ci    }
6347c804472Sopenharmony_ci    std::string jsonStr((std::istreambuf_iterator<char>(inFile)), std::istreambuf_iterator<char>());
6357c804472Sopenharmony_ci    inFile.close();
6367c804472Sopenharmony_ci    return jsonStr;
6377c804472Sopenharmony_ci}
6387c804472Sopenharmony_ci
6397c804472Sopenharmony_ciJson2::Value JsonReader::ParseJsonData2(const std::string& jsonStr)
6407c804472Sopenharmony_ci{
6417c804472Sopenharmony_ci    return Json2::Value(cJSON_Parse(jsonStr.c_str()));
6427c804472Sopenharmony_ci}
6437c804472Sopenharmony_ci
6447c804472Sopenharmony_cistd::string JsonReader::GetErrorPtr()
6457c804472Sopenharmony_ci{
6467c804472Sopenharmony_ci    const char* err = cJSON_GetErrorPtr();
6477c804472Sopenharmony_ci    if (err) {
6487c804472Sopenharmony_ci        return std::string(err);
6497c804472Sopenharmony_ci    }
6507c804472Sopenharmony_ci    return std::string();
6517c804472Sopenharmony_ci}
6527c804472Sopenharmony_ci
6537c804472Sopenharmony_ciJson2::Value JsonReader::CreateObject()
6547c804472Sopenharmony_ci{
6557c804472Sopenharmony_ci    return Json2::Value(cJSON_CreateObject());
6567c804472Sopenharmony_ci}
6577c804472Sopenharmony_ci
6587c804472Sopenharmony_ciJson2::Value JsonReader::CreateArray()
6597c804472Sopenharmony_ci{
6607c804472Sopenharmony_ci    return Json2::Value(cJSON_CreateArray());
6617c804472Sopenharmony_ci}
6627c804472Sopenharmony_ci
6637c804472Sopenharmony_ciJson2::Value JsonReader::CreateBool(const bool value)
6647c804472Sopenharmony_ci{
6657c804472Sopenharmony_ci    return Json2::Value(cJSON_CreateBool(value));
6667c804472Sopenharmony_ci}
6677c804472Sopenharmony_ci
6687c804472Sopenharmony_ciJson2::Value JsonReader::CreateString(const std::string& value)
6697c804472Sopenharmony_ci{
6707c804472Sopenharmony_ci    return Json2::Value(cJSON_CreateString(value.c_str()));
6717c804472Sopenharmony_ci}
6727c804472Sopenharmony_ci
6737c804472Sopenharmony_ciJson2::Value JsonReader::DepthCopy(const Json2::Value& value)
6747c804472Sopenharmony_ci{
6757c804472Sopenharmony_ci    return Json2::Value(cJSON_Duplicate(const_cast<cJSON*>(value.GetJsonPtr()), true));
6767c804472Sopenharmony_ci}
6777c804472Sopenharmony_ci
6787c804472Sopenharmony_ciJson2::Value JsonReader::CreateNull()
6797c804472Sopenharmony_ci{
6807c804472Sopenharmony_ci    return Json2::Value(cJSON_CreateNull());
6817c804472Sopenharmony_ci}