FreeRDP
Loading...
Searching...
No Matches
json.c
1
20#include <math.h>
21#include <errno.h>
22
23#include <winpr/json.h>
24#include <winpr/assert.h>
25
26#if defined(WITH_CJSON)
27#include <cjson/cJSON.h>
28#endif
29#if defined(WITH_JSONC)
30#include <json.h>
31#endif
32
33#if defined(WITH_CJSON)
34#if CJSON_VERSION_MAJOR == 1
35#if (CJSON_VERSION_MINOR < 7) || ((CJSON_VERSION_MINOR == 7) && (CJSON_VERSION_PATCH < 13))
36#define USE_CJSON_COMPAT
37#endif
38#endif
39#endif
40
41#if defined(WITH_JSONC)
42#if JSON_C_MAJOR_VERSION == 0
43#if JSON_C_MINOR_VERSION < 14
44static struct json_object* json_object_new_null(void)
45{
46 return NULL;
47}
48#endif
49#endif
50#endif
51
52#if defined(USE_CJSON_COMPAT)
53static double cJSON_GetNumberValue(const cJSON* prop)
54{
55#ifndef NAN
56#ifdef _WIN32
57#define NAN sqrt(-1.0)
58#define COMPAT_NAN_UNDEF
59#else
60#define NAN 0.0 / 0.0
61#define COMPAT_NAN_UNDEF
62#endif
63#endif
64
65 if (!cJSON_IsNumber(prop))
66 return NAN;
67 char* val = cJSON_GetStringValue(prop);
68 if (!val)
69 return NAN;
70
71 errno = 0;
72 char* endptr = NULL;
73 double dval = strtod(val, &endptr);
74 if (val == endptr)
75 return NAN;
76 if (endptr != NULL)
77 return NAN;
78 if (errno != 0)
79 return NAN;
80 return dval;
81
82#ifdef COMPAT_NAN_UNDEF
83#undef NAN
84#endif
85}
86
87static cJSON* cJSON_ParseWithLength(const char* value, size_t buffer_length)
88{
89 // Check for string '\0' termination.
90 const size_t slen = strnlen(value, buffer_length);
91 if (slen >= buffer_length)
92 {
93 if (value[buffer_length] != '\0')
94 return NULL;
95 }
96 return cJSON_Parse(value);
97}
98#endif
99
100int WINPR_JSON_version(char* buffer, size_t len)
101{
102#if defined(WITH_JSONC)
103 return _snprintf(buffer, len, "json-c %s", json_c_version());
104#elif defined(WITH_CJSON)
105 return _snprintf(buffer, len, "cJSON %s", cJSON_Version());
106#else
107 (void)_snprintf(buffer, len, "JSON support not available");
108 return -1;
109#endif
110}
111
112WINPR_JSON* WINPR_JSON_Parse(const char* value)
113{
114#if defined(WITH_JSONC)
115 return json_tokener_parse(value);
116#elif defined(WITH_CJSON)
117 return cJSON_Parse(value);
118#else
119 WINPR_UNUSED(value);
120 return NULL;
121#endif
122}
123
124WINPR_JSON* WINPR_JSON_ParseWithLength(const char* value, size_t buffer_length)
125{
126#if defined(WITH_JSONC)
127 WINPR_ASSERT(buffer_length <= INT_MAX);
128 json_tokener* tok = json_tokener_new();
129 if (!tok)
130 return NULL;
131 json_object* obj = json_tokener_parse_ex(tok, value, (int)buffer_length);
132 json_tokener_free(tok);
133 return obj;
134#elif defined(WITH_CJSON)
135 return cJSON_ParseWithLength(value, buffer_length);
136#else
137 WINPR_UNUSED(value);
138 WINPR_UNUSED(buffer_length);
139 return NULL;
140#endif
141}
142
143void WINPR_JSON_Delete(WINPR_JSON* item)
144{
145#if defined(WITH_JSONC)
146 json_object_put((json_object*)item);
147#elif defined(WITH_CJSON)
148 cJSON_Delete((cJSON*)item);
149#else
150 WINPR_UNUSED(item);
151#endif
152}
153
154WINPR_JSON* WINPR_JSON_GetArrayItem(const WINPR_JSON* array, size_t index)
155{
156#if defined(WITH_JSONC)
157 return json_object_array_get_idx((const json_object*)array, index);
158#elif defined(WITH_CJSON)
159 WINPR_ASSERT(index <= INT_MAX);
160 return cJSON_GetArrayItem((const cJSON*)array, (INT)index);
161#else
162 WINPR_UNUSED(array);
163 WINPR_UNUSED(index);
164 return NULL;
165#endif
166}
167
168size_t WINPR_JSON_GetArraySize(const WINPR_JSON* array)
169{
170#if defined(WITH_JSONC)
171 return json_object_array_length((const json_object*)array);
172#elif defined(WITH_CJSON)
173 const int rc = cJSON_GetArraySize((const cJSON*)array);
174 if (rc <= 0)
175 return 0;
176 return (size_t)rc;
177#else
178 WINPR_UNUSED(array);
179 return 0;
180#endif
181}
182
183WINPR_JSON* WINPR_JSON_GetObjectItem(const WINPR_JSON* object, const char* string)
184{
185#if defined(WITH_JSONC)
186 return json_object_object_get((const json_object*)object, string);
187#elif defined(WITH_CJSON)
188 return cJSON_GetObjectItem((const cJSON*)object, string);
189#else
190 WINPR_UNUSED(object);
191 WINPR_UNUSED(string);
192 return NULL;
193#endif
194}
195
196WINPR_JSON* WINPR_JSON_GetObjectItemCaseSensitive(const WINPR_JSON* object, const char* string)
197{
198#if defined(WITH_JSONC)
199 return json_object_object_get((const json_object*)object, string);
200#elif defined(WITH_CJSON)
201 return cJSON_GetObjectItemCaseSensitive((const cJSON*)object, string);
202#else
203 WINPR_UNUSED(object);
204 WINPR_UNUSED(string);
205 return NULL;
206#endif
207}
208
209BOOL WINPR_JSON_HasObjectItem(const WINPR_JSON* object, const char* string)
210{
211#if defined(WITH_JSONC)
212 return json_object_object_get_ex((const json_object*)object, string, NULL);
213#elif defined(WITH_CJSON)
214 return cJSON_HasObjectItem((const cJSON*)object, string);
215#else
216 WINPR_UNUSED(object);
217 WINPR_UNUSED(string);
218 return FALSE;
219#endif
220}
221
222const char* WINPR_JSON_GetErrorPtr(void)
223{
224#if defined(WITH_JSONC)
225 return json_util_get_last_err();
226#elif defined(WITH_CJSON)
227 return cJSON_GetErrorPtr();
228#else
229 return NULL;
230#endif
231}
232
233const char* WINPR_JSON_GetStringValue(WINPR_JSON* item)
234{
235#if defined(WITH_JSONC)
236 return json_object_get_string((json_object*)item);
237#elif defined(WITH_CJSON)
238 return cJSON_GetStringValue((cJSON*)item);
239#else
240 WINPR_UNUSED(item);
241 return NULL;
242#endif
243}
244
245double WINPR_JSON_GetNumberValue(const WINPR_JSON* item)
246{
247#if defined(WITH_JSONC)
248 return json_object_get_double((const json_object*)item);
249#elif defined(WITH_CJSON)
250 return cJSON_GetNumberValue((const cJSON*)item);
251#else
252 WINPR_UNUSED(item);
253 return nan("");
254#endif
255}
256
257BOOL WINPR_JSON_IsInvalid(const WINPR_JSON* item)
258{
259#if defined(WITH_JSONC)
260 if (WINPR_JSON_IsArray(item))
261 return FALSE;
262 if (WINPR_JSON_IsObject(item))
263 return FALSE;
264 if (WINPR_JSON_IsNull(item))
265 return FALSE;
266 if (WINPR_JSON_IsNumber(item))
267 return FALSE;
268 if (WINPR_JSON_IsBool(item))
269 return FALSE;
270 if (WINPR_JSON_IsString(item))
271 return FALSE;
272 return TRUE;
273#elif defined(WITH_CJSON)
274 return cJSON_IsInvalid((const cJSON*)item);
275#else
276 WINPR_UNUSED(item);
277 return TRUE;
278#endif
279}
280
281BOOL WINPR_JSON_IsFalse(const WINPR_JSON* item)
282{
283#if defined(WITH_JSONC)
284 if (!json_object_is_type((const json_object*)item, json_type_boolean))
285 return FALSE;
286 json_bool val = json_object_get_boolean((const json_object*)item);
287 return val == 0;
288#elif defined(WITH_CJSON)
289 return cJSON_IsFalse((const cJSON*)item);
290#else
291 WINPR_UNUSED(item);
292 return FALSE;
293#endif
294}
295
296BOOL WINPR_JSON_IsTrue(const WINPR_JSON* item)
297{
298#if defined(WITH_JSONC)
299 if (!json_object_is_type((const json_object*)item, json_type_boolean))
300 return FALSE;
301 json_bool val = json_object_get_boolean((const json_object*)item);
302 return val != 0;
303#elif defined(WITH_CJSON)
304 return cJSON_IsTrue((const cJSON*)item);
305#else
306 WINPR_UNUSED(item);
307 return FALSE;
308#endif
309}
310
311BOOL WINPR_JSON_IsBool(const WINPR_JSON* item)
312{
313#if defined(WITH_JSONC)
314 return json_object_is_type((const json_object*)item, json_type_boolean);
315#elif defined(WITH_CJSON)
316 return cJSON_IsBool((const cJSON*)item);
317#else
318 WINPR_UNUSED(item);
319 return FALSE;
320#endif
321}
322
323BOOL WINPR_JSON_IsNull(const WINPR_JSON* item)
324{
325#if defined(WITH_JSONC)
326 return json_object_is_type((const json_object*)item, json_type_null);
327#elif defined(WITH_CJSON)
328 return cJSON_IsNull((const cJSON*)item);
329#else
330 WINPR_UNUSED(item);
331 return FALSE;
332#endif
333}
334
335BOOL WINPR_JSON_IsNumber(const WINPR_JSON* item)
336{
337#if defined(WITH_JSONC)
338 return json_object_is_type((const json_object*)item, json_type_int) ||
339 json_object_is_type((const json_object*)item, json_type_double);
340#elif defined(WITH_CJSON)
341 return cJSON_IsNumber((const cJSON*)item);
342#else
343 WINPR_UNUSED(item);
344 return FALSE;
345#endif
346}
347
348BOOL WINPR_JSON_IsString(const WINPR_JSON* item)
349{
350#if defined(WITH_JSONC)
351 return json_object_is_type((const json_object*)item, json_type_string);
352#elif defined(WITH_CJSON)
353 return cJSON_IsString((const cJSON*)item);
354#else
355 WINPR_UNUSED(item);
356 return FALSE;
357#endif
358}
359
360BOOL WINPR_JSON_IsArray(const WINPR_JSON* item)
361{
362#if defined(WITH_JSONC)
363 return json_object_is_type((const json_object*)item, json_type_array);
364#elif defined(WITH_CJSON)
365 return cJSON_IsArray((const cJSON*)item);
366#else
367 WINPR_UNUSED(item);
368 return FALSE;
369#endif
370}
371
372BOOL WINPR_JSON_IsObject(const WINPR_JSON* item)
373{
374#if defined(WITH_JSONC)
375 return json_object_is_type((const json_object*)item, json_type_object);
376#elif defined(WITH_CJSON)
377 return cJSON_IsObject((const cJSON*)item);
378#else
379 WINPR_UNUSED(item);
380 return FALSE;
381#endif
382}
383
384WINPR_JSON* WINPR_JSON_CreateNull(void)
385{
386#if defined(WITH_JSONC)
387 return json_object_new_null();
388#elif defined(WITH_CJSON)
389 return cJSON_CreateNull();
390#else
391 return NULL;
392#endif
393}
394
395WINPR_JSON* WINPR_JSON_CreateTrue(void)
396{
397#if defined(WITH_JSONC)
398 return json_object_new_boolean(TRUE);
399#elif defined(WITH_CJSON)
400 return cJSON_CreateTrue();
401#else
402 return NULL;
403#endif
404}
405
406WINPR_JSON* WINPR_JSON_CreateFalse(void)
407{
408#if defined(WITH_JSONC)
409 return json_object_new_boolean(FALSE);
410#elif defined(WITH_CJSON)
411 return cJSON_CreateFalse();
412#else
413 return NULL;
414#endif
415}
416
417WINPR_JSON* WINPR_JSON_CreateBool(BOOL boolean)
418{
419#if defined(WITH_JSONC)
420 return json_object_new_boolean(boolean);
421#elif defined(WITH_CJSON)
422 return cJSON_CreateBool(boolean);
423#else
424 WINPR_UNUSED(boolean);
425 return NULL;
426#endif
427}
428
429WINPR_JSON* WINPR_JSON_CreateNumber(double num)
430{
431#if defined(WITH_JSONC)
432 return json_object_new_double(num);
433#elif defined(WITH_CJSON)
434 return cJSON_CreateNumber(num);
435#else
436 WINPR_UNUSED(num);
437 return NULL;
438#endif
439}
440
441WINPR_JSON* WINPR_JSON_CreateString(const char* string)
442{
443#if defined(WITH_JSONC)
444 return json_object_new_string(string);
445#elif defined(WITH_CJSON)
446 return cJSON_CreateString(string);
447#else
448 WINPR_UNUSED(string);
449 return NULL;
450#endif
451}
452
453WINPR_JSON* WINPR_JSON_CreateArray(void)
454{
455#if defined(WITH_JSONC)
456 return json_object_new_array();
457#elif defined(WITH_CJSON)
458 return cJSON_CreateArray();
459#else
460 return NULL;
461#endif
462}
463
464WINPR_JSON* WINPR_JSON_CreateObject(void)
465{
466#if defined(WITH_JSONC)
467 return json_object_new_object();
468#elif defined(WITH_CJSON)
469 return cJSON_CreateObject();
470#else
471 return NULL;
472#endif
473}
474
475WINPR_JSON* WINPR_JSON_AddNullToObject(WINPR_JSON* object, const char* name)
476{
477#if defined(WITH_JSONC)
478 struct json_object* obj = json_object_new_null();
479 if (json_object_object_add((json_object*)object, name, obj) != 0)
480 {
481 json_object_put(obj);
482 return NULL;
483 }
484 return obj;
485#elif defined(WITH_CJSON)
486 return cJSON_AddNullToObject((cJSON*)object, name);
487#else
488 WINPR_UNUSED(object);
489 WINPR_UNUSED(name);
490 return NULL;
491#endif
492}
493
494WINPR_JSON* WINPR_JSON_AddTrueToObject(WINPR_JSON* object, const char* name)
495{
496#if defined(WITH_JSONC)
497 struct json_object* obj = json_object_new_boolean(TRUE);
498 if (json_object_object_add((json_object*)object, name, obj) != 0)
499 {
500 json_object_put(obj);
501 return NULL;
502 }
503 return obj;
504#elif defined(WITH_CJSON)
505 return cJSON_AddTrueToObject((cJSON*)object, name);
506#else
507 WINPR_UNUSED(object);
508 WINPR_UNUSED(name);
509 return NULL;
510#endif
511}
512
513WINPR_JSON* WINPR_JSON_AddFalseToObject(WINPR_JSON* object, const char* name)
514{
515#if defined(WITH_JSONC)
516 struct json_object* obj = json_object_new_boolean(FALSE);
517 if (json_object_object_add((json_object*)object, name, obj) != 0)
518 {
519 json_object_put(obj);
520 return NULL;
521 }
522 return obj;
523#elif defined(WITH_CJSON)
524 return cJSON_AddFalseToObject((cJSON*)object, name);
525#else
526 WINPR_UNUSED(object);
527 WINPR_UNUSED(name);
528 return NULL;
529#endif
530}
531
532WINPR_JSON* WINPR_JSON_AddBoolToObject(WINPR_JSON* object, const char* name, BOOL boolean)
533{
534#if defined(WITH_JSONC)
535 struct json_object* obj = json_object_new_boolean(boolean);
536 if (json_object_object_add((json_object*)object, name, obj) != 0)
537 {
538 json_object_put(obj);
539 return NULL;
540 }
541 return obj;
542#elif defined(WITH_CJSON)
543 return cJSON_AddBoolToObject((cJSON*)object, name, boolean);
544#else
545 WINPR_UNUSED(object);
546 WINPR_UNUSED(name);
547 WINPR_UNUSED(boolean);
548 return NULL;
549#endif
550}
551
552WINPR_JSON* WINPR_JSON_AddNumberToObject(WINPR_JSON* object, const char* name, double number)
553{
554#if defined(WITH_JSONC)
555 struct json_object* obj = json_object_new_double(number);
556 if (json_object_object_add((json_object*)object, name, obj) != 0)
557 {
558 json_object_put(obj);
559 return NULL;
560 }
561 return obj;
562#elif defined(WITH_CJSON)
563 return cJSON_AddNumberToObject((cJSON*)object, name, number);
564#else
565 WINPR_UNUSED(object);
566 WINPR_UNUSED(name);
567 WINPR_UNUSED(number);
568 return NULL;
569#endif
570}
571
572WINPR_JSON* WINPR_JSON_AddStringToObject(WINPR_JSON* object, const char* name, const char* string)
573{
574#if defined(WITH_JSONC)
575 struct json_object* obj = json_object_new_string(string);
576 if (json_object_object_add((json_object*)object, name, obj) != 0)
577 {
578 json_object_put(obj);
579 return NULL;
580 }
581 return obj;
582#elif defined(WITH_CJSON)
583 return cJSON_AddStringToObject((cJSON*)object, name, string);
584#else
585 WINPR_UNUSED(object);
586 WINPR_UNUSED(name);
587 WINPR_UNUSED(string);
588 return NULL;
589#endif
590}
591
592WINPR_JSON* WINPR_JSON_AddObjectToObject(WINPR_JSON* object, const char* name)
593{
594#if defined(WITH_JSONC)
595 struct json_object* obj = json_object_new_object();
596 if (json_object_object_add((json_object*)object, name, obj) != 0)
597 {
598 json_object_put(obj);
599 return NULL;
600 }
601 return obj;
602#elif defined(WITH_CJSON)
603 return cJSON_AddObjectToObject((cJSON*)object, name);
604#else
605 WINPR_UNUSED(object);
606 WINPR_UNUSED(name);
607 return NULL;
608#endif
609}
610
611BOOL WINPR_JSON_AddItemToArray(WINPR_JSON* array, WINPR_JSON* item)
612{
613#if defined(WITH_JSONC)
614 const int rc = json_object_array_add((json_object*)array, (json_object*)item);
615 if (rc != 0)
616 return FALSE;
617 return TRUE;
618#elif defined(WITH_CJSON)
619#if defined(USE_CJSON_COMPAT)
620 if ((array == NULL) || (item == NULL))
621 return FALSE;
622 cJSON_AddItemToArray((cJSON*)array, (cJSON*)item);
623 return TRUE;
624#else
625 return cJSON_AddItemToArray((cJSON*)array, (cJSON*)item);
626#endif
627#else
628 WINPR_UNUSED(array);
629 WINPR_UNUSED(item);
630 return FALSE;
631#endif
632}
633
634WINPR_JSON* WINPR_JSON_AddArrayToObject(WINPR_JSON* object, const char* name)
635{
636#if defined(WITH_JSONC)
637 struct json_object* obj = json_object_new_array();
638 if (json_object_object_add((json_object*)object, name, obj) != 0)
639 {
640 json_object_put(obj);
641 return NULL;
642 }
643 return obj;
644#elif defined(WITH_CJSON)
645 return cJSON_AddArrayToObject((cJSON*)object, name);
646#else
647 WINPR_UNUSED(object);
648 WINPR_UNUSED(name);
649 return NULL;
650#endif
651}
652
653char* WINPR_JSON_Print(WINPR_JSON* item)
654{
655#if defined(WITH_JSONC)
656 const char* str = json_object_to_json_string_ext((json_object*)item, JSON_C_TO_STRING_PRETTY);
657 if (!str)
658 return NULL;
659 return _strdup(str);
660#elif defined(WITH_CJSON)
661 return cJSON_Print((const cJSON*)item);
662#else
663 WINPR_UNUSED(item);
664 return NULL;
665#endif
666}
667
668char* WINPR_JSON_PrintUnformatted(WINPR_JSON* item)
669{
670#if defined(WITH_JSONC)
671 const char* str = json_object_to_json_string_ext((json_object*)item, JSON_C_TO_STRING_PLAIN);
672 if (!str)
673 return NULL;
674 return _strdup(str);
675#elif defined(WITH_CJSON)
676 return cJSON_PrintUnformatted((const cJSON*)item);
677#else
678 WINPR_UNUSED(item);
679 return NULL;
680#endif
681}
WINPR_JSON * WINPR_JSON_CreateBool(BOOL boolean)
WINPR_JSON_CreateBool.
Definition json.c:417
WINPR_JSON * WINPR_JSON_CreateString(const char *string)
WINPR_JSON_CreateString.
Definition json.c:441
BOOL WINPR_JSON_HasObjectItem(const WINPR_JSON *object, const char *string)
Check if JSON has an object matching the name.
Definition json.c:209
WINPR_JSON * WINPR_JSON_AddNumberToObject(WINPR_JSON *object, const char *name, double number)
WINPR_JSON_AddNumberToObject.
Definition json.c:552
BOOL WINPR_JSON_IsNull(const WINPR_JSON *item)
Check if JSON item is Null.
Definition json.c:323
WINPR_JSON * WINPR_JSON_GetObjectItem(const WINPR_JSON *object, const char *string)
Return a pointer to an JSON object item.
Definition json.c:183
BOOL WINPR_JSON_IsString(const WINPR_JSON *item)
Check if JSON item is of type String.
Definition json.c:348
BOOL WINPR_JSON_AddItemToArray(WINPR_JSON *array, WINPR_JSON *item)
Add an item to an existing array.
Definition json.c:611
WINPR_JSON * WINPR_JSON_AddArrayToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddArrayToObject.
Definition json.c:634
BOOL WINPR_JSON_IsBool(const WINPR_JSON *item)
Check if JSON item is of type BOOL.
Definition json.c:311
double WINPR_JSON_GetNumberValue(const WINPR_JSON *item)
Return the Number value of a JSON item.
Definition json.c:245
WINPR_JSON * WINPR_JSON_AddTrueToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddTrueToObject.
Definition json.c:494
WINPR_JSON * WINPR_JSON_CreateObject(void)
WINPR_JSON_CreateObject.
Definition json.c:464
WINPR_JSON * WINPR_JSON_CreateArray(void)
WINPR_JSON_CreateArray.
Definition json.c:453
int WINPR_JSON_version(char *buffer, size_t len)
Get the library version string.
Definition json.c:100
char * WINPR_JSON_Print(WINPR_JSON *item)
Serialize a JSON instance to string for minimal size without formatting see WINPR_JSON_PrintUnformatt...
Definition json.c:653
WINPR_JSON * WINPR_JSON_AddFalseToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddFalseToObject.
Definition json.c:513
BOOL WINPR_JSON_IsNumber(const WINPR_JSON *item)
Check if JSON item is of type Number.
Definition json.c:335
WINPR_JSON * WINPR_JSON_GetArrayItem(const WINPR_JSON *array, size_t index)
Return a pointer to an item in the array.
Definition json.c:154
WINPR_JSON * WINPR_JSON_GetObjectItemCaseSensitive(const WINPR_JSON *object, const char *string)
Same as WINPR_JSON_GetObjectItem but with case insensitive matching.
Definition json.c:196
WINPR_JSON * WINPR_JSON_AddStringToObject(WINPR_JSON *object, const char *name, const char *string)
WINPR_JSON_AddStringToObject.
Definition json.c:572
WINPR_JSON * WINPR_JSON_ParseWithLength(const char *value, size_t buffer_length)
Parse a JSON string.
Definition json.c:124
WINPR_JSON * WINPR_JSON_CreateFalse(void)
WINPR_JSON_CreateFalse.
Definition json.c:406
WINPR_JSON * WINPR_JSON_CreateNumber(double num)
WINPR_JSON_CreateNumber.
Definition json.c:429
BOOL WINPR_JSON_IsObject(const WINPR_JSON *item)
Check if JSON item is of type Object.
Definition json.c:372
WINPR_JSON * WINPR_JSON_AddBoolToObject(WINPR_JSON *object, const char *name, BOOL boolean)
WINPR_JSON_AddBoolToObject.
Definition json.c:532
BOOL WINPR_JSON_IsInvalid(const WINPR_JSON *item)
Check if JSON item is valid.
Definition json.c:257
char * WINPR_JSON_PrintUnformatted(WINPR_JSON *item)
Serialize a JSON instance to string without formatting for human readable formatted output see WINPR_...
Definition json.c:668
WINPR_JSON * WINPR_JSON_CreateNull(void)
WINPR_JSON_CreateNull.
Definition json.c:384
const char * WINPR_JSON_GetStringValue(WINPR_JSON *item)
Return the String value of a JSON item.
Definition json.c:233
WINPR_JSON * WINPR_JSON_AddNullToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddNullToObject.
Definition json.c:475
WINPR_JSON * WINPR_JSON_CreateTrue(void)
WINPR_JSON_CreateTrue.
Definition json.c:395
BOOL WINPR_JSON_IsFalse(const WINPR_JSON *item)
Check if JSON item is BOOL value False.
Definition json.c:281
void WINPR_JSON_Delete(WINPR_JSON *item)
Delete a WinPR JSON wrapper object.
Definition json.c:143
size_t WINPR_JSON_GetArraySize(const WINPR_JSON *array)
Get the number of arrayitems from an array.
Definition json.c:168
BOOL WINPR_JSON_IsArray(const WINPR_JSON *item)
Check if JSON item is of type Array.
Definition json.c:360
const char * WINPR_JSON_GetErrorPtr(void)
Return an error string.
Definition json.c:222
WINPR_JSON * WINPR_JSON_AddObjectToObject(WINPR_JSON *object, const char *name)
WINPR_JSON_AddObjectToObject.
Definition json.c:592
WINPR_JSON * WINPR_JSON_Parse(const char *value)
Parse a '\0' terminated JSON string.
Definition json.c:112
BOOL WINPR_JSON_IsTrue(const WINPR_JSON *item)
Check if JSON item is BOOL value True.
Definition json.c:296