• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development 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 "cJsonNapiH/cjsonnapi.h"
17 
getAdditemtoobjTypeOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonObj)18 napi_value getAdditemtoobjTypeOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonObj)
19 {
20     napi_status status;
21     const napi_extended_error_info *extended_error_info;
22     const char *tag = "[KH180_cJSON_AddItemToObject]";
23     napi_value typeOut;
24     /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象
25      * env: 当前环境的句柄
26      * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
27      * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
28      */
29     status = napi_create_int32(env, jsonObj == NULL ? 0 : jsonObj->type, &typeOut);
30     if (status != napi_ok) {
31         getErrMessage(status, env, extended_error_info, "napi_create_int32", tag);
32         return nullptr;
33     }
34     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
35      * env: 当前环境的句柄
36      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
37      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
38      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
39      */
40     status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "type", typeOut);
41     if (status != napi_ok) {
42         /* [NAPI_GEN]: 错误处理*/
43         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
44         return nullptr;
45     }
46     return cJSON_AddItemToObjectOut;
47 }
48 
getAdditemtoobjValuesintOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonObj)49 napi_value getAdditemtoobjValuesintOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonObj)
50 {
51     napi_status status;
52     const napi_extended_error_info *extended_error_info;
53     const char *tag = "[KH180_cJSON_AddItemToObject]";
54     napi_value valueintOut;
55     /* [NAPI_GEN]: 返回值是int32_t类型时,napi_create_int32 创建一个包含32位整数(int32_t)的js数值(Number)对象
56      * env: 当前环境的句柄
57      * value: 要准换成js数值的int32_t的值,这里以传入1为例,用例新增业务代码时可根据自身需求修改
58      * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
59      */
60     status = napi_create_int32(env, jsonObj == NULL ? 0 : jsonObj->valueint, &valueintOut);
61     if (status != napi_ok) {
62         getErrMessage(status, env, extended_error_info, "napi_create_int32", tag);
63         return nullptr;
64     }
65     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
66      * env: 当前环境的句柄
67      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
68      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
69      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
70      */
71     status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "valueint", valueintOut);
72     if (status != napi_ok) {
73         /* [NAPI_GEN]: 错误处理*/
74         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
75         return nullptr;
76     }
77     return cJSON_AddItemToObjectOut;
78 }
79 
getAdditemtoobjValuesdoubleOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonObj)80 napi_value getAdditemtoobjValuesdoubleOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonObj)
81 {
82     napi_status status;
83     const napi_extended_error_info *extended_error_info;
84     const char *tag = "[KH180_cJSON_AddItemToObject]";
85     napi_value valuedoubleOut;
86     /* [NAPI_GEN]: 返回值是double类型时,napi_create_double 创建一个包含双精度浮点数的js数值(Number)对象
87      * env: 当前环境的句柄
88      * value: 要传递给js的双精度浮点数值,这里以传入1.0为例,用例新增业务代码时可根据自身需求修改
89      * result: 指向napi_value的指针,这个指针会被设置为新创建的js数值对象
90      */
91     status = napi_create_double(env, jsonObj == NULL ? 0 : jsonObj->valuedouble, &valuedoubleOut);
92     if (status != napi_ok) {
93         getErrMessage(status, env, extended_error_info, "napi_create_double", tag);
94         return nullptr;
95     }
96     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
97      * env: 当前环境的句柄
98      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
99      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
100      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
101      */
102     status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "valuedouble", valuedoubleOut);
103     if (status != napi_ok) {
104         /* [NAPI_GEN]: 错误处理*/
105         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
106         return nullptr;
107     }
108     return cJSON_AddItemToObjectOut;
109 }
110 
getAdditemtoobjValuestringOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonOut)111 napi_value getAdditemtoobjValuestringOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonOut)
112 {
113     napi_status status;
114     const napi_extended_error_info *extended_error_info;
115     const char *tag = "[KH180_cJSON_AddItemToObject]";
116     napi_value valuestringOut;
117     /* [NAPI_GEN]:
118      * 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个等价的js字符串
119      * env: 当前环境的句柄
120      * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以valuestring举例,用户可根据需求修改
121      * length:
122      * 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
123      * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
124      */
125     status = napi_create_string_utf8(env, jsonOut->valuestring == nullptr ? "" : jsonOut->valuestring, NAPI_AUTO_LENGTH,
126                                      &valuestringOut);
127     if (status != napi_ok) {
128         /*错误处理*/
129         getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag);
130         return nullptr;
131     }
132     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
133      * env: 当前环境的句柄
134      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
135      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
136      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
137      */
138     status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "valuestring", valuestringOut);
139     if (status != napi_ok) {
140         /* [NAPI_GEN]: 错误处理*/
141         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
142         return nullptr;
143     }
144     return cJSON_AddItemToObjectOut;
145 }
146 
getAdditemtoobjStringOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonOut)147 napi_value getAdditemtoobjStringOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonOut)
148 {
149     napi_status status;
150     const napi_extended_error_info *extended_error_info;
151     const char *tag = "[KH180_cJSON_AddItemToObject]";
152     napi_value stringOut;
153     /* [NAPI_GEN]:
154      * 返回值是字符串时,napi_create_string_utf8用于在原生代码中创建一个新的js字符串。这个函数会根据提供的UTF-8编码的字符串创建一个
155      * 等价的js字符串
156      * env: 当前环境的句柄
157      * str: 指向以null结尾的UTF-8编码的C字符串的指针,这里以string举例,用户可根据需求修改
158      * length:
159      * 字符串的长度,可以是具体的字节数,或者使用特殊的值NAPI_AUTO_LENGTH来让函数自己计算长度(假定字符串以null结尾)
160      * result: 指向napi_value的指针,函数执行成功后这个指针将指向新创建的js字符串
161      */
162     status =
163         napi_create_string_utf8(env, jsonOut->string == nullptr ? "" : jsonOut->string, NAPI_AUTO_LENGTH, &stringOut);
164     if (jsonOut->string != NULL) {
165         OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH180_cJSON_AddItemToObject", "jsonOut->string: %s",
166             jsonOut->string);
167     }
168     if (status != napi_ok) {
169         /*错误处理*/
170         getErrMessage(status, env, extended_error_info, "napi_create_string_utf8", tag);
171         return nullptr;
172     }
173     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
174      * env: 当前环境的句柄
175      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
176      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
177      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
178      */
179     status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "string", stringOut);
180     if (status != napi_ok) {
181         /* [NAPI_GEN]: 错误处理*/
182         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
183         return nullptr;
184     }
185     return cJSON_AddItemToObjectOut;
186 }
187 
getAdditemtoobjNextOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonObj)188 napi_value getAdditemtoobjNextOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonObj)
189 {
190     napi_status status;
191     const napi_extended_error_info *extended_error_info;
192     const char *tag = "[KH180_cJSON_AddItemToObject]";
193     napi_value nextOut;
194     /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
195      * env: 当前环境的句柄
196      * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
197      */
198     status = napi_create_object(env, &nextOut);
199     if (status != napi_ok) {
200         getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
201         return nullptr;
202     }
203     // 给jsonObj->next赋值
204     if (jsonObj == NULL) {
205         return NULL;
206     }
207     if (jsonObj->next != NULL) {
208         nextOut = getAdditemtoobjTypeOut(env, nextOut, jsonObj->next);
209         nextOut = getAdditemtoobjValuesdoubleOut(env, nextOut, jsonObj->next);
210         nextOut = getAdditemtoobjValuesintOut(env, nextOut, jsonObj->next);
211         nextOut = getAdditemtoobjValuestringOut(env, nextOut, jsonObj->next);
212         nextOut = getAdditemtoobjStringOut(env, nextOut, jsonObj->next);
213         if (jsonObj->next->next != NULL) {
214             cJSON *nextNext = jsonObj->next->next;
215             if (nextNext != NULL) {
216                 nextOut = getAdditemtoobjNextOut(env, nextOut, jsonObj->next);
217             }
218         }
219     }
220     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
221      * env: 当前环境的句柄
222      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
223      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
224      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
225      */
226     status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "next", nextOut);
227     if (status != napi_ok) {
228         /* [NAPI_GEN]: 错误处理*/
229         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
230         return nullptr;
231     }
232     return cJSON_AddItemToObjectOut;
233 }
234 
getJsonarritemChildOut(napi_env env,napi_value childOut,cJSON * jsonObj)235 napi_value getJsonarritemChildOut(napi_env env, napi_value childOut, cJSON *jsonObj)
236 {
237     if (jsonObj->child != NULL) {
238         childOut = getAdditemtoobjTypeOut(env, childOut, jsonObj->child);
239         childOut = getAdditemtoobjValuesdoubleOut(env, childOut, jsonObj->child);
240         childOut = getAdditemtoobjValuesintOut(env, childOut, jsonObj->child);
241         childOut = getAdditemtoobjValuestringOut(env, childOut, jsonObj->child);
242         childOut = getAdditemtoobjStringOut(env, childOut, jsonObj->child);
243         if (jsonObj->child->next != NULL) {
244             cJSON *childNext = jsonObj->child->next;
245             if (childNext != NULL) {
246                 childOut = getAdditemtoobjNextOut(env, childOut, jsonObj->child);
247             }
248         } else if (jsonObj->child->child != NULL) {
249             cJSON *childChild = jsonObj->child->child;
250             if (childChild != NULL) {
251                 childOut = getAdditemtoobjChildOut(env, childOut, jsonObj->child);
252             }
253         }
254     }
255     return childOut;
256 }
257 
258 /* 将C++ cJSON对象返回js层
259  * 输入:待返回的js对象,c++ cJSON对象
260  * 输出:返回js的对象
261  */
getAdditemtoobjChildOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonObj)262 napi_value getAdditemtoobjChildOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonObj)
263 {
264     napi_status status;
265     const napi_extended_error_info *extended_error_info;
266     const char *tag = "[KH180_cJSON_AddItemToObject]";
267     napi_value childOut;
268     /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
269      * env: 当前环境的句柄
270      * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
271      */
272     status = napi_create_object(env, &childOut);
273     if (status != napi_ok) {
274         getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
275         return nullptr;
276     }
277     // 给jsonObj->child赋值
278     if (jsonObj != NULL) {
279         childOut = getJsonarritemChildOut(env, childOut, jsonObj);
280     }
281     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
282      * env: 当前环境的句柄
283      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
284      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
285      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
286      */
287     status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "child", childOut);
288     if (status != napi_ok) {
289         /* [NAPI_GEN]: 错误处理*/
290         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
291         return nullptr;
292     }
293     return cJSON_AddItemToObjectOut;
294 }
295 
getAdditemtoobjPrevOut(napi_env env,napi_value cJSON_AddItemToObjectOut,cJSON * jsonObj)296 napi_value getAdditemtoobjPrevOut(napi_env env, napi_value cJSON_AddItemToObjectOut, cJSON *jsonObj)
297 {
298     napi_status status;
299     const napi_extended_error_info *extended_error_info;
300     const char *tag = "[KH180_cJSON_AddItemToObject]";
301     napi_value prevOut;
302     /* [NAPI_GEN]: 返回值是对象时,需要使用napi_create_object创建一个js的对象与js代码交互
303      * env: 当前环境的句柄
304      * result: 一个napi_value的指针,该指针将被设置为新创建的js对象
305      */
306     status = napi_create_object(env, &prevOut);
307     if (status != napi_ok) {
308         getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
309         return nullptr;
310     }
311     /* [NAPI_GEN]: 返回值是对象时,将native侧的对象的属性和值依次塞入napi_create_object创建出的对象,最终将该对象返回js
312      * env: 当前环境的句柄
313      * object: 要设置属性的js对象,该对象是由上文napi_create_object创建的
314      * utf8name: 属性的名称,是一个以UTF-8编码的字符串
315      * value: 与属性名称关联的值,这个值可以是任何js类型(如一个数值、字符串、另一个对象等)
316      */
317     status = napi_set_named_property(env, cJSON_AddItemToObjectOut, "prev", prevOut);
318     if (status != napi_ok) {
319         /* [NAPI_GEN]: 错误处理*/
320         getErrMessage(status, env, extended_error_info, "napi_set_named_property", tag);
321         return nullptr;
322     }
323     return cJSON_AddItemToObjectOut;
324 }
325 
getAdditemtoobjInfoParam1(napi_env env,napi_value propName)326 char *getAdditemtoobjInfoParam1(napi_env env, napi_value propName)
327 {
328     napi_status status;
329     const napi_extended_error_info *extended_error_info;
330     const char *tag = "[KH180_cJSON_AddItemToObject]";
331     napi_valuetype valuetypestring;
332     /* [NAPI_GEN]: 获取入参类型,第1个入参
333      * env: N-API环境的句柄,表示当前的上下文
334      * value: 要检查类型的js值
335      * result: 是一个指针,指向napi_valuetype枚举的值,函数会将结果存储在这里
336      */
337     status = napi_typeof(env, propName, &valuetypestring);
338     if (status != napi_ok) {
339         getErrMessage(status, env, extended_error_info, "napi_typeof", tag);
340         return nullptr;
341     }
342     size_t strSize1 = 0;
343     /* [NAPI_GEN]: napi_get_value_string_utf8用于将Js字符串转换为UTF-8编码的C字符串
344      * env: N-API环境的句柄,表示当前的上下文
345      * value: 要转换的JavaScript字符串
346      * buf: 用于存储结果的字符数组的指针
347      * bufsize: 缓冲区大小,以字节为单位
348      * result: 转换后的字符串的字节长度(不包括空终止符)。若干buf是NULL,则返回所需的缓冲区大小(包括空终止符)
349      */
350     /* [NAPI_GEN]: buf参数是NULL时,用于获取所需缓冲区大小*/
351     status = napi_get_value_string_utf8(env, propName, NULL, 0, &strSize1);
352     if (status != napi_ok) {
353         getErrMessage(status, env, extended_error_info, "get value string", tag);
354         return nullptr;
355     }
356     char *stringIn = new char[strSize1 + 1];
357     /* [NAPI_GEN]: 用于获取字符串*/
358     status = napi_get_value_string_utf8(env, propName, stringIn, strSize1 + 1, &strSize1);
359     if (status != napi_ok) {
360         getErrMessage(status, env, extended_error_info, "get value string", tag);
361         delete[] stringIn;
362         return nullptr;
363     }
364     return stringIn;
365 }
366 
getAdditemtoobjInfoParam2(napi_env env,napi_value objItem)367 char *getAdditemtoobjInfoParam2(napi_env env, napi_value objItem)
368 {
369     napi_status status;
370     const napi_extended_error_info *extended_error_info;
371     const char *tag = "[KH180_cJSON_AddItemToObject]";
372     // 从objItem里面获取valuestring
373     napi_value paramValueIn;
374     status = napi_get_named_property(env, objItem, "valuestring", &paramValueIn); // 读取属性值
375     if (status != napi_ok) {
376         getErrMessage(status, env, extended_error_info, "get named property", tag);
377         return NULL;
378     }
379     size_t strSize = 0;
380     /* [NAPI_GEN]: napi_get_value_string_utf8用于将Js字符串转换为UTF-8编码的C字符串
381      * env: N-API环境的句柄,表示当前的上下文
382      * value: 要转换的JavaScript字符串
383      * buf: 用于存储结果的字符数组的指针
384      * bufsize: 缓冲区大小,以字节为单位
385      * result: 转换后的字符串的字节长度(不包括空终止符)。若干buf是NULL,则返回所需的缓冲区大小(包括空终止符)
386      */
387     /* [NAPI_GEN]: buf参数是NULL时,用于获取所需缓冲区大小*/
388     status = napi_get_value_string_utf8(env, paramValueIn, NULL, 0, &strSize);
389     if (status != napi_ok) {
390         getErrMessage(status, env, extended_error_info, "get value string", tag);
391         return nullptr;
392     }
393     char *valueString = new char[strSize + 1];
394     /* [NAPI_GEN]: 用于获取字符串*/
395     status = napi_get_value_string_utf8(env, paramValueIn, valueString, strSize + 1, &strSize);
396     if (status != napi_ok) {
397         getErrMessage(status, env, extended_error_info, "get value string", tag);
398         delete[] valueString;
399         return nullptr;
400     }
401     return valueString;
402 }
403 
getCjsonAddItemToObjRes(napi_env env,napi_value cjsonObj,napi_value propName,napi_value objItem)404 cJSON *getCjsonAddItemToObjRes(napi_env env, napi_value cjsonObj, napi_value propName, napi_value objItem)
405 {
406     const char *tag = "[KH180_cJSON_AddItemToObject]";
407     char *stringIn = getAdditemtoobjInfoParam1(env, propName);
408     char *valueString = getAdditemtoobjInfoParam2(env, objItem);
409     cJSON *root = cJSON_CreateObject();
410     // 初始化obj
411     root = initCJSON_Object(env, cjsonObj, root, tag);
412 
413     cJSON *jsonArray = cJSON_CreateArray();
414     jsonArray = initCJSON_Array(env, objItem, jsonArray, tag, false);
415     char *rootString1 = cJSON_Print(jsonArray);
416     if (rootString1 != NULL) {
417         // 需要去掉字符串中的\n 这样方便查找打印出的字符串
418         std::string printRootStr = rootString1;
419         RemoveNewlines(printRootStr);
420         OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH180_cJSON_AddItemToObject", "rootString1: %s",
421             printRootStr.c_str());
422     }
423     cJSON_bool jsonArrayRes = cJSON_IsArray(jsonArray);
424     cJSON *jsonObject = cJSON_CreateObject();
425     jsonObject = initCJSON_Object(env, objItem, jsonObject, tag);
426     bool jsonObjectNull = false;
427     char *rootString4 = cJSON_Print(jsonObject);
428     if (rootString4 != NULL) {
429         // 需要去掉字符串中的\n 这样方便查找打印出的字符串
430         std::string printRootStr = rootString4;
431         RemoveNewlines(printRootStr);
432         if (printRootStr == "{}") {
433             jsonObjectNull = true;
434         }
435         OH_LOG_Print(LOG_APP, LOG_INFO, LOG_PRINT_DOMAIN, "KH180_cJSON_AddItemToObject", "rootString4: %s",
436             printRootStr.c_str());
437     }
438     if (!jsonObjectNull) {
439         cJSON_AddItemToObject(root, stringIn, jsonObject);
440     } else if (jsonArrayRes) {
441         cJSON_AddItemToObject(root, stringIn, jsonArray);
442     } else {
443         cJSON_AddItemToObject(root, stringIn, cJSON_CreateString(valueString));
444     }
445 
446     delete[] valueString;
447     delete[] stringIn;
448     return root;
449 }
450 
451 /* [NAPI_GEN]:对应cJSON.h中: CJSON_PUBLIC(cJSON_bool) cJSON_AddItemToObject(cJSON *object, const char *string,
452  * cJSON *item); 的napi方法,
453  * 输入:一个cJSON对象,需要添加的item名字(字符串),需要加入cJSON对象的item(cJSON 对象)
454  * 输出:添加item后的cJSON对象
455  */
KH180_cJSON_AddItemToObject(napi_env env,napi_callback_info info)456 napi_value KH180_cJSON_AddItemToObject(napi_env env, napi_callback_info info)
457 {
458     napi_status status;
459     /* [NAPI_GEN]: Node.js在其N-API中用来提供错误的扩展信息的结构体,结构体包含以下字段
460      * error_message: 一个指向错误详细字符串的指针,提供了关于错误的文本描述
461      * engin_reserved: 一个保留给Js引擎使用的指针
462      * error_code: 错误码,指示了错误的种类,比如napi_pending_exception表示有一个JavaScript异常未被清理。
463      * engine_error_code:一个引擎特定的错误码,为引擎实现保留,具体含义依赖于使用的JavaScript引擎。
464      * error_message_len:错误消息字符串的长度。
465      */
466     const napi_extended_error_info *extended_error_info;
467     /* [NAPI_GEN]: tag: 日志打印标签*/
468     const char *tag = "[KH180_cJSON_AddItemToObject]";
469     /* [NAPI_GEN]: get function param in*/
470     /* [NAPI_GEN]: argc:js传入的参数个数 */
471     size_t argc = PARAMS3;
472     /* [NAPI_GEN]: args: 一个数组,保存js传入的参数 */
473     napi_value args[PARAMS3] = {nullptr};
474     /* [NAPI_GEN]: napi_get_cb_info用于获取JS调用该函数时所传递的参数、接收参数的个数以及'this'的值
475      * env: 当前环境的句柄,代表当前的Node.js环境
476      * info: 回调信息句柄,代表当前回调的上下文
477      * argc: 指向size_t的指针,最初应包含可接受的最大参数数量,函数返回时,它将包含实际传递的参数数量
478      * args: 一个足够大的数组,用于接收传递给回调函数的所有js参数。数组的大小应至少与argc传入的值一样大。
479      * this_arg: 如果不是NULL,则返回js回调中this的值
480      * data: 如果不是NULL,则返回与回调函数关联的任何可选数据。通常用于传递在创建函数时指定的静态数据
481      */
482     status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
483     if (status != napi_ok) {
484         getErrMessage(status, env, extended_error_info, "napi_get_cb_info", tag);
485         return nullptr;
486     }
487 
488     // Todo: add business logic. 在这前后代码为框架所生成
489     cJSON *root = NULL;
490     root = getCjsonAddItemToObjRes(env, args[PARAMS0], args[PARAMS1], args[PARAMS2]);
491 
492     /* [NAPI_GEN]: function return value*/
493     napi_value cJSON_AddItemToObjectOut;
494     // 注意: 这里应该返回cJSON,以便js层拿到结果 将属性一个个塞入object
495     status = napi_create_object(env, &cJSON_AddItemToObjectOut);
496     if (status != napi_ok) {
497         getErrMessage(status, env, extended_error_info, "napi_create_object", tag);
498         return nullptr;
499     }
500 
501     cJSON_AddItemToObjectOut = getAdditemtoobjChildOut(env, cJSON_AddItemToObjectOut, root);
502     cJSON_AddItemToObjectOut = getAdditemtoobjNextOut(env, cJSON_AddItemToObjectOut, root);
503     cJSON_AddItemToObjectOut = getAdditemtoobjPrevOut(env, cJSON_AddItemToObjectOut, root);
504     cJSON_AddItemToObjectOut = getAdditemtoobjTypeOut(env, cJSON_AddItemToObjectOut, root);
505     cJSON_AddItemToObjectOut = getAdditemtoobjValuesdoubleOut(env, cJSON_AddItemToObjectOut, root);
506     cJSON_AddItemToObjectOut = getAdditemtoobjValuesintOut(env, cJSON_AddItemToObjectOut, root);
507     cJSON_AddItemToObjectOut = getAdditemtoobjValuestringOut(env, cJSON_AddItemToObjectOut, root);
508     cJSON_AddItemToObjectOut = getAdditemtoobjStringOut(env, cJSON_AddItemToObjectOut, root);
509 
510     return cJSON_AddItemToObjectOut;
511 }
512