1 /* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #include "utils_json.h" 17 18 #include <stddef.h> 19 20 #include "cJSON.h" 21 22 #ifdef __cplusplus 23 extern "C" { 24 #endif 25 DslmCreateJson(const char * data)26 DslmJsonHandle DslmCreateJson(const char *data) 27 { 28 cJSON *root = NULL; 29 30 if (data != NULL) { 31 root = cJSON_Parse(data); 32 } else { 33 root = cJSON_CreateObject(); 34 } 35 return (void *)root; 36 } 37 DslmDestroyJson(DslmJsonHandle handle)38 void DslmDestroyJson(DslmJsonHandle handle) 39 { 40 if (handle != NULL) { 41 cJSON_Delete((cJSON *)handle); 42 } 43 } 44 DslmGetJsonFieldInt(DslmJsonHandle handle,const char * field)45 int32_t DslmGetJsonFieldInt(DslmJsonHandle handle, const char *field) 46 { 47 int32_t ret = -1; 48 49 if (handle == NULL) { 50 return ret; 51 } 52 53 if (field == NULL) { 54 return ((cJSON *)handle)->valueint; 55 } 56 57 cJSON *objValue = NULL; 58 59 do { 60 objValue = (cJSON *)DslmGetJsonFieldJson(handle, field); 61 if (objValue == NULL) { 62 break; 63 } 64 if (!cJSON_IsNumber(objValue)) { 65 break; 66 } 67 ret = objValue->valueint; 68 } while (0); 69 70 return ret; 71 } 72 DslmGetJsonFieldIntArray(DslmJsonHandle handle,const char * field,int32_t * array,int32_t arrayLen)73 uint32_t DslmGetJsonFieldIntArray(DslmJsonHandle handle, const char *field, int32_t *array, int32_t arrayLen) 74 { 75 if (handle == NULL || field == NULL || array == NULL) { 76 return 0; 77 } 78 79 cJSON *objValue = cJSON_GetObjectItem(handle, field); 80 if (objValue == NULL) { 81 return 0; 82 } 83 if (!cJSON_IsArray(objValue)) { 84 return 0; 85 } 86 87 int size = cJSON_GetArraySize(objValue); 88 if (size > arrayLen) { 89 size = arrayLen; 90 } 91 uint32_t index = 0; 92 for (int32_t i = 0; i < size; i++) { 93 cJSON *item = cJSON_GetArrayItem(objValue, i); 94 if (!cJSON_IsNumber(item)) { 95 continue; 96 } 97 array[index++] = item->valueint; 98 } 99 100 return index; 101 } 102 DslmAddFieldBoolToJson(DslmJsonHandle handle,const char * field,bool value)103 void DslmAddFieldBoolToJson(DslmJsonHandle handle, const char *field, bool value) 104 { 105 if (handle == NULL || field == NULL) { 106 return; 107 } 108 (void)cJSON_AddBoolToObject((cJSON *)handle, field, value); 109 } 110 DslmGetJsonFieldString(DslmJsonHandle handle,const char * field)111 const char *DslmGetJsonFieldString(DslmJsonHandle handle, const char *field) 112 { 113 if (handle == NULL) { 114 return NULL; 115 } 116 if (field == NULL) { 117 return ((cJSON *)handle)->valuestring; 118 } 119 cJSON *objValue = NULL; 120 const char *payload = NULL; 121 122 do { 123 objValue = (cJSON *)DslmGetJsonFieldJson(handle, field); 124 if (objValue == NULL) { 125 break; 126 } 127 payload = cJSON_GetStringValue(objValue); 128 if (payload == NULL) { 129 break; 130 } 131 } while (0); 132 return payload; 133 } 134 DslmGetJsonFieldJson(DslmJsonHandle handle,const char * field)135 DslmJsonHandle DslmGetJsonFieldJson(DslmJsonHandle handle, const char *field) 136 { 137 return cJSON_GetObjectItem((cJSON *)handle, field); 138 } 139 DslmGetJsonFieldJsonArray(DslmJsonHandle handle,uint32_t num)140 DslmJsonHandle DslmGetJsonFieldJsonArray(DslmJsonHandle handle, uint32_t num) 141 { 142 return cJSON_GetArrayItem((cJSON *)handle, num); 143 } 144 DslmGetJsonFieldJsonArraySize(DslmJsonHandle handle)145 int32_t DslmGetJsonFieldJsonArraySize(DslmJsonHandle handle) 146 { 147 return cJSON_GetArraySize((cJSON *)handle); 148 } 149 DslmAddFieldIntToJson(DslmJsonHandle handle,const char * field,int32_t value)150 void DslmAddFieldIntToJson(DslmJsonHandle handle, const char *field, int32_t value) 151 { 152 if (handle == NULL || field == NULL) { 153 return; 154 } 155 (void)cJSON_AddNumberToObject((cJSON *)handle, field, value); 156 } 157 DslmAddFieldIntArrayToJson(DslmJsonHandle handle,const char * field,const int32_t * array,int32_t arrayLen)158 void DslmAddFieldIntArrayToJson(DslmJsonHandle handle, const char *field, const int32_t *array, int32_t arrayLen) 159 { 160 if (handle == NULL || field == NULL || array == NULL) { 161 return; 162 } 163 cJSON *arrayObj = cJSON_CreateIntArray(array, arrayLen); 164 if (arrayObj == NULL) { 165 return; 166 } 167 (void)cJSON_AddItemToObject((cJSON *)handle, field, arrayObj); 168 } 169 DslmAddFieldStringToJson(DslmJsonHandle handle,const char * field,const char * value)170 void DslmAddFieldStringToJson(DslmJsonHandle handle, const char *field, const char *value) 171 { 172 if (handle == NULL || field == NULL || value == NULL) { 173 return; 174 } 175 (void)cJSON_AddStringToObject((cJSON *)handle, field, value); 176 } 177 DslmAddFieldJsonToJson(DslmJsonHandle handle,const char * field,DslmJsonHandle json)178 void DslmAddFieldJsonToJson(DslmJsonHandle handle, const char *field, DslmJsonHandle json) 179 { 180 if (handle == NULL || field == NULL || json == NULL) { 181 return; 182 } 183 (void)cJSON_AddItemToObject((cJSON *)handle, field, json); 184 } 185 DslmConvertJsonToString(DslmJsonHandle handle)186 char *DslmConvertJsonToString(DslmJsonHandle handle) 187 { 188 if (handle != NULL) { 189 char *ret = cJSON_PrintUnformatted((cJSON *)handle); 190 return ret; 191 } 192 return NULL; 193 } 194 DslmCompareJsonData(DslmJsonHandle handleA,DslmJsonHandle handleB,bool caseSensitive)195 bool DslmCompareJsonData(DslmJsonHandle handleA, DslmJsonHandle handleB, bool caseSensitive) 196 { 197 if (handleA == NULL || handleB == NULL) { 198 return false; 199 } 200 return cJSON_Compare(handleA, handleB, caseSensitive); 201 } 202 203 #ifdef __cplusplus 204 } 205 #endif