1e509ee18Sopenharmony_ci/* 2e509ee18Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3e509ee18Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4e509ee18Sopenharmony_ci * you may not use this file except in compliance with the License. 5e509ee18Sopenharmony_ci * You may obtain a copy of the License at 6e509ee18Sopenharmony_ci * 7e509ee18Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8e509ee18Sopenharmony_ci * 9e509ee18Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10e509ee18Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11e509ee18Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12e509ee18Sopenharmony_ci * See the License for the specific language governing permissions and 13e509ee18Sopenharmony_ci * limitations under the License. 14e509ee18Sopenharmony_ci */ 15e509ee18Sopenharmony_ci 16e509ee18Sopenharmony_ci#include "tooling/base/pt_json.h" 17e509ee18Sopenharmony_ci 18e509ee18Sopenharmony_ci#include "libpandabase/macros.h" 19e509ee18Sopenharmony_ci 20e509ee18Sopenharmony_cinamespace panda::ecmascript::tooling { 21e509ee18Sopenharmony_cistd::unique_ptr<PtJson> PtJson::CreateObject() 22e509ee18Sopenharmony_ci{ 23e509ee18Sopenharmony_ci return std::make_unique<PtJson>(cJSON_CreateObject()); 24e509ee18Sopenharmony_ci} 25e509ee18Sopenharmony_ci 26e509ee18Sopenharmony_cistd::unique_ptr<PtJson> PtJson::CreateArray() 27e509ee18Sopenharmony_ci{ 28e509ee18Sopenharmony_ci return std::make_unique<PtJson>(cJSON_CreateArray()); 29e509ee18Sopenharmony_ci} 30e509ee18Sopenharmony_ci 31e509ee18Sopenharmony_civoid PtJson::ReleaseRoot() 32e509ee18Sopenharmony_ci{ 33e509ee18Sopenharmony_ci if (object_ != nullptr) { 34e509ee18Sopenharmony_ci cJSON_Delete(object_); 35e509ee18Sopenharmony_ci object_ = nullptr; 36e509ee18Sopenharmony_ci } 37e509ee18Sopenharmony_ci} 38e509ee18Sopenharmony_ci 39e509ee18Sopenharmony_cistd::unique_ptr<PtJson> PtJson::Parse(const std::string &data) 40e509ee18Sopenharmony_ci{ 41e509ee18Sopenharmony_ci cJSON *value = cJSON_ParseWithOpts(data.c_str(), nullptr, true); 42e509ee18Sopenharmony_ci return std::make_unique<PtJson>(value); 43e509ee18Sopenharmony_ci} 44e509ee18Sopenharmony_ci 45e509ee18Sopenharmony_cistd::string PtJson::Stringify() const 46e509ee18Sopenharmony_ci{ 47e509ee18Sopenharmony_ci if (object_ == nullptr) { 48e509ee18Sopenharmony_ci return ""; 49e509ee18Sopenharmony_ci } 50e509ee18Sopenharmony_ci 51e509ee18Sopenharmony_ci char *str = cJSON_PrintUnformatted(object_); 52e509ee18Sopenharmony_ci if (str == nullptr) { 53e509ee18Sopenharmony_ci return ""; 54e509ee18Sopenharmony_ci } 55e509ee18Sopenharmony_ci 56e509ee18Sopenharmony_ci std::string result(str); 57e509ee18Sopenharmony_ci cJSON_free(str); 58e509ee18Sopenharmony_ci return result; 59e509ee18Sopenharmony_ci} 60e509ee18Sopenharmony_ci 61e509ee18Sopenharmony_cibool PtJson::Add(const char *key, bool value) const 62e509ee18Sopenharmony_ci{ 63e509ee18Sopenharmony_ci ASSERT(key != nullptr && !Contains(key)); 64e509ee18Sopenharmony_ci 65e509ee18Sopenharmony_ci cJSON *node = cJSON_CreateBool(value); 66e509ee18Sopenharmony_ci if (node == nullptr) { 67e509ee18Sopenharmony_ci return false; 68e509ee18Sopenharmony_ci } 69e509ee18Sopenharmony_ci 70e509ee18Sopenharmony_ci cJSON_bool ret = cJSON_AddItemToObject(object_, key, node); 71e509ee18Sopenharmony_ci if (ret == 0) { 72e509ee18Sopenharmony_ci cJSON_Delete(node); 73e509ee18Sopenharmony_ci return false; 74e509ee18Sopenharmony_ci } 75e509ee18Sopenharmony_ci 76e509ee18Sopenharmony_ci return true; 77e509ee18Sopenharmony_ci} 78e509ee18Sopenharmony_ci 79e509ee18Sopenharmony_cibool PtJson::Add(const char *key, int32_t value) const 80e509ee18Sopenharmony_ci{ 81e509ee18Sopenharmony_ci return Add(key, static_cast<double>(value)); 82e509ee18Sopenharmony_ci} 83e509ee18Sopenharmony_ci 84e509ee18Sopenharmony_cibool PtJson::Add(const char *key, int64_t value) const 85e509ee18Sopenharmony_ci{ 86e509ee18Sopenharmony_ci return Add(key, static_cast<double>(value)); 87e509ee18Sopenharmony_ci} 88e509ee18Sopenharmony_ci 89e509ee18Sopenharmony_cibool PtJson::Add(const char *key, uint32_t value) const 90e509ee18Sopenharmony_ci{ 91e509ee18Sopenharmony_ci return Add(key, static_cast<double>(value)); 92e509ee18Sopenharmony_ci} 93e509ee18Sopenharmony_ci 94e509ee18Sopenharmony_cibool PtJson::Add(const char *key, double value) const 95e509ee18Sopenharmony_ci{ 96e509ee18Sopenharmony_ci ASSERT(key != nullptr && !Contains(key)); 97e509ee18Sopenharmony_ci 98e509ee18Sopenharmony_ci cJSON *node = cJSON_CreateNumber(value); 99e509ee18Sopenharmony_ci if (node == nullptr) { 100e509ee18Sopenharmony_ci return false; 101e509ee18Sopenharmony_ci } 102e509ee18Sopenharmony_ci 103e509ee18Sopenharmony_ci cJSON_bool ret = cJSON_AddItemToObject(object_, key, node); 104e509ee18Sopenharmony_ci if (ret == 0) { 105e509ee18Sopenharmony_ci cJSON_Delete(node); 106e509ee18Sopenharmony_ci return false; 107e509ee18Sopenharmony_ci } 108e509ee18Sopenharmony_ci 109e509ee18Sopenharmony_ci return true; 110e509ee18Sopenharmony_ci} 111e509ee18Sopenharmony_ci 112e509ee18Sopenharmony_cibool PtJson::Add(const char *key, const char *value) const 113e509ee18Sopenharmony_ci{ 114e509ee18Sopenharmony_ci ASSERT(key != nullptr && !Contains(key)); 115e509ee18Sopenharmony_ci 116e509ee18Sopenharmony_ci cJSON *node = cJSON_CreateString(value); 117e509ee18Sopenharmony_ci if (node == nullptr) { 118e509ee18Sopenharmony_ci return false; 119e509ee18Sopenharmony_ci } 120e509ee18Sopenharmony_ci 121e509ee18Sopenharmony_ci cJSON_bool ret = cJSON_AddItemToObject(object_, key, node); 122e509ee18Sopenharmony_ci if (ret == 0) { 123e509ee18Sopenharmony_ci cJSON_Delete(node); 124e509ee18Sopenharmony_ci return false; 125e509ee18Sopenharmony_ci } 126e509ee18Sopenharmony_ci 127e509ee18Sopenharmony_ci return true; 128e509ee18Sopenharmony_ci} 129e509ee18Sopenharmony_ci 130e509ee18Sopenharmony_cibool PtJson::Add(const char *key, const std::unique_ptr<PtJson> &value) const 131e509ee18Sopenharmony_ci{ 132e509ee18Sopenharmony_ci ASSERT(key != nullptr && !Contains(key)); 133e509ee18Sopenharmony_ci 134e509ee18Sopenharmony_ci cJSON *node = value->GetJson(); 135e509ee18Sopenharmony_ci if (node == nullptr) { 136e509ee18Sopenharmony_ci return false; 137e509ee18Sopenharmony_ci } 138e509ee18Sopenharmony_ci 139e509ee18Sopenharmony_ci cJSON_bool ret = cJSON_AddItemToObject(object_, key, node); 140e509ee18Sopenharmony_ci if (ret == 0) { 141e509ee18Sopenharmony_ci return false; 142e509ee18Sopenharmony_ci } 143e509ee18Sopenharmony_ci 144e509ee18Sopenharmony_ci return true; 145e509ee18Sopenharmony_ci} 146e509ee18Sopenharmony_ci 147e509ee18Sopenharmony_cibool PtJson::Push(bool value) const 148e509ee18Sopenharmony_ci{ 149e509ee18Sopenharmony_ci cJSON *node = cJSON_CreateBool(value); 150e509ee18Sopenharmony_ci if (node == nullptr) { 151e509ee18Sopenharmony_ci return false; 152e509ee18Sopenharmony_ci } 153e509ee18Sopenharmony_ci 154e509ee18Sopenharmony_ci cJSON_bool ret = cJSON_AddItemToArray(object_, node); 155e509ee18Sopenharmony_ci if (ret == 0) { 156e509ee18Sopenharmony_ci cJSON_Delete(node); 157e509ee18Sopenharmony_ci return false; 158e509ee18Sopenharmony_ci } 159e509ee18Sopenharmony_ci 160e509ee18Sopenharmony_ci return true; 161e509ee18Sopenharmony_ci} 162e509ee18Sopenharmony_ci 163e509ee18Sopenharmony_cibool PtJson::Push(int32_t value) const 164e509ee18Sopenharmony_ci{ 165e509ee18Sopenharmony_ci return Push(static_cast<double>(value)); 166e509ee18Sopenharmony_ci} 167e509ee18Sopenharmony_ci 168e509ee18Sopenharmony_cibool PtJson::Push(int64_t value) const 169e509ee18Sopenharmony_ci{ 170e509ee18Sopenharmony_ci return Push(static_cast<double>(value)); 171e509ee18Sopenharmony_ci} 172e509ee18Sopenharmony_ci 173e509ee18Sopenharmony_cibool PtJson::Push(uint32_t value) const 174e509ee18Sopenharmony_ci{ 175e509ee18Sopenharmony_ci return Push(static_cast<double>(value)); 176e509ee18Sopenharmony_ci} 177e509ee18Sopenharmony_ci 178e509ee18Sopenharmony_cibool PtJson::Push(double value) const 179e509ee18Sopenharmony_ci{ 180e509ee18Sopenharmony_ci cJSON *node = cJSON_CreateNumber(value); 181e509ee18Sopenharmony_ci if (node == nullptr) { 182e509ee18Sopenharmony_ci return false; 183e509ee18Sopenharmony_ci } 184e509ee18Sopenharmony_ci 185e509ee18Sopenharmony_ci cJSON_bool ret = cJSON_AddItemToArray(object_, node); 186e509ee18Sopenharmony_ci if (ret == 0) { 187e509ee18Sopenharmony_ci cJSON_Delete(node); 188e509ee18Sopenharmony_ci return false; 189e509ee18Sopenharmony_ci } 190e509ee18Sopenharmony_ci 191e509ee18Sopenharmony_ci return true; 192e509ee18Sopenharmony_ci} 193e509ee18Sopenharmony_ci 194e509ee18Sopenharmony_cibool PtJson::Push(const char *value) const 195e509ee18Sopenharmony_ci{ 196e509ee18Sopenharmony_ci cJSON *node = cJSON_CreateString(value); 197e509ee18Sopenharmony_ci if (node == nullptr) { 198e509ee18Sopenharmony_ci return false; 199e509ee18Sopenharmony_ci } 200e509ee18Sopenharmony_ci 201e509ee18Sopenharmony_ci cJSON_bool ret = cJSON_AddItemToArray(object_, node); 202e509ee18Sopenharmony_ci if (ret == 0) { 203e509ee18Sopenharmony_ci cJSON_Delete(node); 204e509ee18Sopenharmony_ci return false; 205e509ee18Sopenharmony_ci } 206e509ee18Sopenharmony_ci 207e509ee18Sopenharmony_ci return true; 208e509ee18Sopenharmony_ci} 209e509ee18Sopenharmony_ci 210e509ee18Sopenharmony_cibool PtJson::Push(const std::unique_ptr<PtJson> &value) const 211e509ee18Sopenharmony_ci{ 212e509ee18Sopenharmony_ci if (value == nullptr) { 213e509ee18Sopenharmony_ci return false; 214e509ee18Sopenharmony_ci } 215e509ee18Sopenharmony_ci 216e509ee18Sopenharmony_ci cJSON *node = value->GetJson(); 217e509ee18Sopenharmony_ci if (node == nullptr) { 218e509ee18Sopenharmony_ci return false; 219e509ee18Sopenharmony_ci } 220e509ee18Sopenharmony_ci 221e509ee18Sopenharmony_ci cJSON_bool ret = cJSON_AddItemToArray(object_, node); 222e509ee18Sopenharmony_ci if (ret == 0) { 223e509ee18Sopenharmony_ci return false; 224e509ee18Sopenharmony_ci } 225e509ee18Sopenharmony_ci 226e509ee18Sopenharmony_ci return true; 227e509ee18Sopenharmony_ci} 228e509ee18Sopenharmony_ci 229e509ee18Sopenharmony_cibool PtJson::Remove(const char *key) const 230e509ee18Sopenharmony_ci{ 231e509ee18Sopenharmony_ci ASSERT(key != nullptr && Contains(key)); 232e509ee18Sopenharmony_ci 233e509ee18Sopenharmony_ci cJSON_DeleteItemFromObject(object_, key); 234e509ee18Sopenharmony_ci return true; 235e509ee18Sopenharmony_ci} 236e509ee18Sopenharmony_ci 237e509ee18Sopenharmony_cibool PtJson::Contains(const char *key) const 238e509ee18Sopenharmony_ci{ 239e509ee18Sopenharmony_ci cJSON *node = cJSON_GetObjectItemCaseSensitive(object_, key); 240e509ee18Sopenharmony_ci return node != nullptr; 241e509ee18Sopenharmony_ci} 242e509ee18Sopenharmony_ci 243e509ee18Sopenharmony_cistd::string PtJson::GetKey() const 244e509ee18Sopenharmony_ci{ 245e509ee18Sopenharmony_ci if (object_ == nullptr || object_->string == nullptr) { 246e509ee18Sopenharmony_ci return ""; 247e509ee18Sopenharmony_ci } 248e509ee18Sopenharmony_ci 249e509ee18Sopenharmony_ci return std::string(object_->string); 250e509ee18Sopenharmony_ci} 251e509ee18Sopenharmony_ci 252e509ee18Sopenharmony_cicJSON *PtJson::GetJson() const 253e509ee18Sopenharmony_ci{ 254e509ee18Sopenharmony_ci return object_; 255e509ee18Sopenharmony_ci} 256e509ee18Sopenharmony_ci 257e509ee18Sopenharmony_cibool PtJson::IsBool() const 258e509ee18Sopenharmony_ci{ 259e509ee18Sopenharmony_ci return cJSON_IsBool(object_) != 0; 260e509ee18Sopenharmony_ci} 261e509ee18Sopenharmony_ci 262e509ee18Sopenharmony_cibool PtJson::IsNumber() const 263e509ee18Sopenharmony_ci{ 264e509ee18Sopenharmony_ci return cJSON_IsNumber(object_) != 0; 265e509ee18Sopenharmony_ci} 266e509ee18Sopenharmony_ci 267e509ee18Sopenharmony_cibool PtJson::IsString() const 268e509ee18Sopenharmony_ci{ 269e509ee18Sopenharmony_ci return cJSON_IsString(object_) != 0; 270e509ee18Sopenharmony_ci} 271e509ee18Sopenharmony_ci 272e509ee18Sopenharmony_cibool PtJson::IsObject() const 273e509ee18Sopenharmony_ci{ 274e509ee18Sopenharmony_ci return cJSON_IsObject(object_) != 0; 275e509ee18Sopenharmony_ci} 276e509ee18Sopenharmony_ci 277e509ee18Sopenharmony_cibool PtJson::IsArray() const 278e509ee18Sopenharmony_ci{ 279e509ee18Sopenharmony_ci return cJSON_IsArray(object_) != 0; 280e509ee18Sopenharmony_ci} 281e509ee18Sopenharmony_ci 282e509ee18Sopenharmony_cibool PtJson::IsNull() const 283e509ee18Sopenharmony_ci{ 284e509ee18Sopenharmony_ci return cJSON_IsNull(object_) != 0; 285e509ee18Sopenharmony_ci} 286e509ee18Sopenharmony_ci 287e509ee18Sopenharmony_cibool PtJson::GetBool(bool defaultValue) const 288e509ee18Sopenharmony_ci{ 289e509ee18Sopenharmony_ci if (!IsBool()) { 290e509ee18Sopenharmony_ci return defaultValue; 291e509ee18Sopenharmony_ci } 292e509ee18Sopenharmony_ci 293e509ee18Sopenharmony_ci return cJSON_IsTrue(object_) != 0; 294e509ee18Sopenharmony_ci} 295e509ee18Sopenharmony_ci 296e509ee18Sopenharmony_ciint32_t PtJson::GetInt(int32_t defaultValue) const 297e509ee18Sopenharmony_ci{ 298e509ee18Sopenharmony_ci if (!IsNumber()) { 299e509ee18Sopenharmony_ci return defaultValue; 300e509ee18Sopenharmony_ci } 301e509ee18Sopenharmony_ci 302e509ee18Sopenharmony_ci return static_cast<int32_t>(object_->valuedouble); 303e509ee18Sopenharmony_ci} 304e509ee18Sopenharmony_ci 305e509ee18Sopenharmony_ciint64_t PtJson::GetInt64(int64_t defaultValue) const 306e509ee18Sopenharmony_ci{ 307e509ee18Sopenharmony_ci if (!IsNumber()) { 308e509ee18Sopenharmony_ci return defaultValue; 309e509ee18Sopenharmony_ci } 310e509ee18Sopenharmony_ci 311e509ee18Sopenharmony_ci return static_cast<int64_t>(object_->valuedouble); 312e509ee18Sopenharmony_ci} 313e509ee18Sopenharmony_ci 314e509ee18Sopenharmony_ciuint32_t PtJson::GetUInt(uint32_t defaultValue) const 315e509ee18Sopenharmony_ci{ 316e509ee18Sopenharmony_ci if (!IsNumber()) { 317e509ee18Sopenharmony_ci return defaultValue; 318e509ee18Sopenharmony_ci } 319e509ee18Sopenharmony_ci 320e509ee18Sopenharmony_ci return static_cast<uint32_t>(object_->valuedouble); 321e509ee18Sopenharmony_ci} 322e509ee18Sopenharmony_ci 323e509ee18Sopenharmony_ciuint64_t PtJson::GetUInt64(uint64_t defaultValue) const 324e509ee18Sopenharmony_ci{ 325e509ee18Sopenharmony_ci if (!IsNumber()) { 326e509ee18Sopenharmony_ci return defaultValue; 327e509ee18Sopenharmony_ci } 328e509ee18Sopenharmony_ci 329e509ee18Sopenharmony_ci return static_cast<uint64_t>(object_->valuedouble); 330e509ee18Sopenharmony_ci} 331e509ee18Sopenharmony_ci 332e509ee18Sopenharmony_cidouble PtJson::GetDouble(double defaultValue) const 333e509ee18Sopenharmony_ci{ 334e509ee18Sopenharmony_ci if (!IsNumber()) { 335e509ee18Sopenharmony_ci return defaultValue; 336e509ee18Sopenharmony_ci } 337e509ee18Sopenharmony_ci 338e509ee18Sopenharmony_ci return object_->valuedouble; 339e509ee18Sopenharmony_ci} 340e509ee18Sopenharmony_ci 341e509ee18Sopenharmony_cistd::string PtJson::GetString() const 342e509ee18Sopenharmony_ci{ 343e509ee18Sopenharmony_ci if (!IsString()) { 344e509ee18Sopenharmony_ci return ""; 345e509ee18Sopenharmony_ci } 346e509ee18Sopenharmony_ci 347e509ee18Sopenharmony_ci return std::string(object_->valuestring); 348e509ee18Sopenharmony_ci} 349e509ee18Sopenharmony_ci 350e509ee18Sopenharmony_ciint32_t PtJson::GetSize() const 351e509ee18Sopenharmony_ci{ 352e509ee18Sopenharmony_ci return cJSON_GetArraySize(object_); 353e509ee18Sopenharmony_ci} 354e509ee18Sopenharmony_ci 355e509ee18Sopenharmony_cistd::unique_ptr<PtJson> PtJson::Get(int32_t index) const 356e509ee18Sopenharmony_ci{ 357e509ee18Sopenharmony_ci return std::make_unique<PtJson>(cJSON_GetArrayItem(object_, index)); 358e509ee18Sopenharmony_ci} 359e509ee18Sopenharmony_ci 360e509ee18Sopenharmony_ciResult PtJson::GetBool(const char *key, bool *value) const 361e509ee18Sopenharmony_ci{ 362e509ee18Sopenharmony_ci cJSON *item = cJSON_GetObjectItem(object_, key); 363e509ee18Sopenharmony_ci if (item == nullptr) { 364e509ee18Sopenharmony_ci return Result::NOT_EXIST; 365e509ee18Sopenharmony_ci } 366e509ee18Sopenharmony_ci if (cJSON_IsBool(item) == 0) { 367e509ee18Sopenharmony_ci return Result::TYPE_ERROR; 368e509ee18Sopenharmony_ci } 369e509ee18Sopenharmony_ci 370e509ee18Sopenharmony_ci *value = cJSON_IsTrue(item) != 0; 371e509ee18Sopenharmony_ci return Result::SUCCESS; 372e509ee18Sopenharmony_ci} 373e509ee18Sopenharmony_ci 374e509ee18Sopenharmony_ciResult PtJson::GetInt(const char *key, int32_t *value) const 375e509ee18Sopenharmony_ci{ 376e509ee18Sopenharmony_ci double result; 377e509ee18Sopenharmony_ci Result ret = GetDouble(key, &result); 378e509ee18Sopenharmony_ci if (ret == Result::SUCCESS) { 379e509ee18Sopenharmony_ci *value = static_cast<int32_t>(result); 380e509ee18Sopenharmony_ci } 381e509ee18Sopenharmony_ci return ret; 382e509ee18Sopenharmony_ci} 383e509ee18Sopenharmony_ci 384e509ee18Sopenharmony_ciResult PtJson::GetInt64(const char *key, int64_t *value) const 385e509ee18Sopenharmony_ci{ 386e509ee18Sopenharmony_ci double result; 387e509ee18Sopenharmony_ci Result ret = GetDouble(key, &result); 388e509ee18Sopenharmony_ci if (ret == Result::SUCCESS) { 389e509ee18Sopenharmony_ci *value = static_cast<int64_t>(result); 390e509ee18Sopenharmony_ci } 391e509ee18Sopenharmony_ci return ret; 392e509ee18Sopenharmony_ci} 393e509ee18Sopenharmony_ci 394e509ee18Sopenharmony_ciResult PtJson::GetUInt(const char *key, uint32_t *value) const 395e509ee18Sopenharmony_ci{ 396e509ee18Sopenharmony_ci double result; 397e509ee18Sopenharmony_ci Result ret = GetDouble(key, &result); 398e509ee18Sopenharmony_ci if (ret == Result::SUCCESS) { 399e509ee18Sopenharmony_ci *value = static_cast<uint32_t>(result); 400e509ee18Sopenharmony_ci } 401e509ee18Sopenharmony_ci return ret; 402e509ee18Sopenharmony_ci} 403e509ee18Sopenharmony_ci 404e509ee18Sopenharmony_ciResult PtJson::GetUInt64(const char *key, uint64_t *value) const 405e509ee18Sopenharmony_ci{ 406e509ee18Sopenharmony_ci double result; 407e509ee18Sopenharmony_ci Result ret = GetDouble(key, &result); 408e509ee18Sopenharmony_ci if (ret == Result::SUCCESS) { 409e509ee18Sopenharmony_ci *value = static_cast<uint64_t>(result); 410e509ee18Sopenharmony_ci } 411e509ee18Sopenharmony_ci return ret; 412e509ee18Sopenharmony_ci} 413e509ee18Sopenharmony_ci 414e509ee18Sopenharmony_ciResult PtJson::GetDouble(const char *key, double *value) const 415e509ee18Sopenharmony_ci{ 416e509ee18Sopenharmony_ci cJSON *item = cJSON_GetObjectItem(object_, key); 417e509ee18Sopenharmony_ci if (item == nullptr) { 418e509ee18Sopenharmony_ci return Result::NOT_EXIST; 419e509ee18Sopenharmony_ci } 420e509ee18Sopenharmony_ci if (cJSON_IsNumber(item) == 0) { 421e509ee18Sopenharmony_ci return Result::TYPE_ERROR; 422e509ee18Sopenharmony_ci } 423e509ee18Sopenharmony_ci 424e509ee18Sopenharmony_ci *value = item->valuedouble; 425e509ee18Sopenharmony_ci return Result::SUCCESS; 426e509ee18Sopenharmony_ci} 427e509ee18Sopenharmony_ci 428e509ee18Sopenharmony_ciResult PtJson::GetString(const char *key, std::string *value) const 429e509ee18Sopenharmony_ci{ 430e509ee18Sopenharmony_ci cJSON *item = cJSON_GetObjectItem(object_, key); 431e509ee18Sopenharmony_ci if (item == nullptr) { 432e509ee18Sopenharmony_ci return Result::NOT_EXIST; 433e509ee18Sopenharmony_ci } 434e509ee18Sopenharmony_ci if (cJSON_IsString(item) == 0) { 435e509ee18Sopenharmony_ci return Result::TYPE_ERROR; 436e509ee18Sopenharmony_ci } 437e509ee18Sopenharmony_ci 438e509ee18Sopenharmony_ci *value = item->valuestring; 439e509ee18Sopenharmony_ci return Result::SUCCESS; 440e509ee18Sopenharmony_ci} 441e509ee18Sopenharmony_ci 442e509ee18Sopenharmony_ciResult PtJson::GetObject(const char *key, std::unique_ptr<PtJson> *value) const 443e509ee18Sopenharmony_ci{ 444e509ee18Sopenharmony_ci cJSON *item = cJSON_GetObjectItem(object_, key); 445e509ee18Sopenharmony_ci if (item == nullptr) { 446e509ee18Sopenharmony_ci return Result::NOT_EXIST; 447e509ee18Sopenharmony_ci } 448e509ee18Sopenharmony_ci if (cJSON_IsObject(item) == 0) { 449e509ee18Sopenharmony_ci return Result::TYPE_ERROR; 450e509ee18Sopenharmony_ci } 451e509ee18Sopenharmony_ci 452e509ee18Sopenharmony_ci *value = std::make_unique<PtJson>(item); 453e509ee18Sopenharmony_ci return Result::SUCCESS; 454e509ee18Sopenharmony_ci} 455e509ee18Sopenharmony_ci 456e509ee18Sopenharmony_ciResult PtJson::GetArray(const char *key, std::unique_ptr<PtJson> *value) const 457e509ee18Sopenharmony_ci{ 458e509ee18Sopenharmony_ci cJSON *item = cJSON_GetObjectItem(object_, key); 459e509ee18Sopenharmony_ci if (item == nullptr) { 460e509ee18Sopenharmony_ci return Result::NOT_EXIST; 461e509ee18Sopenharmony_ci } 462e509ee18Sopenharmony_ci if (cJSON_IsArray(item) == 0) { 463e509ee18Sopenharmony_ci return Result::TYPE_ERROR; 464e509ee18Sopenharmony_ci } 465e509ee18Sopenharmony_ci 466e509ee18Sopenharmony_ci *value = std::make_unique<PtJson>(item); 467e509ee18Sopenharmony_ci return Result::SUCCESS; 468e509ee18Sopenharmony_ci} 469e509ee18Sopenharmony_ci 470e509ee18Sopenharmony_ciResult PtJson::GetAny(const char *key, std::unique_ptr<PtJson> *value) const 471e509ee18Sopenharmony_ci{ 472e509ee18Sopenharmony_ci cJSON *item = cJSON_GetObjectItem(object_, key); 473e509ee18Sopenharmony_ci if (item == nullptr) { 474e509ee18Sopenharmony_ci return Result::NOT_EXIST; 475e509ee18Sopenharmony_ci } 476e509ee18Sopenharmony_ci 477e509ee18Sopenharmony_ci *value = std::make_unique<PtJson>(item); 478e509ee18Sopenharmony_ci return Result::SUCCESS; 479e509ee18Sopenharmony_ci} 480e509ee18Sopenharmony_ci} // namespace panda::ecmascript 481