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