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