• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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