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