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