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}