1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker SPDX-License-Identifier: MIT 3*61046927SAndroid Build Coastguard Worker 4*61046927SAndroid Build Coastguard Worker Parson 1.5.3 (https://github.com/kgabis/parson) 5*61046927SAndroid Build Coastguard Worker Copyright (c) 2012 - 2023 Krzysztof Gabis 6*61046927SAndroid Build Coastguard Worker 7*61046927SAndroid Build Coastguard Worker Permission is hereby granted, free of charge, to any person obtaining a copy 8*61046927SAndroid Build Coastguard Worker of this software and associated documentation files (the "Software"), to deal 9*61046927SAndroid Build Coastguard Worker in the Software without restriction, including without limitation the rights 10*61046927SAndroid Build Coastguard Worker to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11*61046927SAndroid Build Coastguard Worker copies of the Software, and to permit persons to whom the Software is 12*61046927SAndroid Build Coastguard Worker furnished to do so, subject to the following conditions: 13*61046927SAndroid Build Coastguard Worker 14*61046927SAndroid Build Coastguard Worker The above copyright notice and this permission notice shall be included in 15*61046927SAndroid Build Coastguard Worker all copies or substantial portions of the Software. 16*61046927SAndroid Build Coastguard Worker 17*61046927SAndroid Build Coastguard Worker THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18*61046927SAndroid Build Coastguard Worker IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19*61046927SAndroid Build Coastguard Worker FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 20*61046927SAndroid Build Coastguard Worker AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21*61046927SAndroid Build Coastguard Worker LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 22*61046927SAndroid Build Coastguard Worker OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 23*61046927SAndroid Build Coastguard Worker THE SOFTWARE. 24*61046927SAndroid Build Coastguard Worker */ 25*61046927SAndroid Build Coastguard Worker 26*61046927SAndroid Build Coastguard Worker #ifndef parson_parson_h 27*61046927SAndroid Build Coastguard Worker #define parson_parson_h 28*61046927SAndroid Build Coastguard Worker 29*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 30*61046927SAndroid Build Coastguard Worker extern "C" 31*61046927SAndroid Build Coastguard Worker { 32*61046927SAndroid Build Coastguard Worker #endif 33*61046927SAndroid Build Coastguard Worker #if 0 34*61046927SAndroid Build Coastguard Worker } /* unconfuse xcode */ 35*61046927SAndroid Build Coastguard Worker #endif 36*61046927SAndroid Build Coastguard Worker 37*61046927SAndroid Build Coastguard Worker #define PARSON_VERSION_MAJOR 1 38*61046927SAndroid Build Coastguard Worker #define PARSON_VERSION_MINOR 5 39*61046927SAndroid Build Coastguard Worker #define PARSON_VERSION_PATCH 3 40*61046927SAndroid Build Coastguard Worker 41*61046927SAndroid Build Coastguard Worker #define PARSON_VERSION_STRING "1.5.3" 42*61046927SAndroid Build Coastguard Worker 43*61046927SAndroid Build Coastguard Worker #include <stddef.h> /* size_t */ 44*61046927SAndroid Build Coastguard Worker 45*61046927SAndroid Build Coastguard Worker /* Types and enums */ 46*61046927SAndroid Build Coastguard Worker typedef struct json_object_t JSON_Object; 47*61046927SAndroid Build Coastguard Worker typedef struct json_array_t JSON_Array; 48*61046927SAndroid Build Coastguard Worker typedef struct json_value_t JSON_Value; 49*61046927SAndroid Build Coastguard Worker 50*61046927SAndroid Build Coastguard Worker enum json_value_type { 51*61046927SAndroid Build Coastguard Worker JSONError = -1, 52*61046927SAndroid Build Coastguard Worker JSONNull = 1, 53*61046927SAndroid Build Coastguard Worker JSONString = 2, 54*61046927SAndroid Build Coastguard Worker JSONNumber = 3, 55*61046927SAndroid Build Coastguard Worker JSONObject = 4, 56*61046927SAndroid Build Coastguard Worker JSONArray = 5, 57*61046927SAndroid Build Coastguard Worker JSONBoolean = 6 58*61046927SAndroid Build Coastguard Worker }; 59*61046927SAndroid Build Coastguard Worker typedef int JSON_Value_Type; 60*61046927SAndroid Build Coastguard Worker 61*61046927SAndroid Build Coastguard Worker enum json_result_t { 62*61046927SAndroid Build Coastguard Worker JSONSuccess = 0, 63*61046927SAndroid Build Coastguard Worker JSONFailure = -1 64*61046927SAndroid Build Coastguard Worker }; 65*61046927SAndroid Build Coastguard Worker typedef int JSON_Status; 66*61046927SAndroid Build Coastguard Worker 67*61046927SAndroid Build Coastguard Worker typedef void * (*JSON_Malloc_Function)(size_t); 68*61046927SAndroid Build Coastguard Worker typedef void (*JSON_Free_Function)(void *); 69*61046927SAndroid Build Coastguard Worker 70*61046927SAndroid Build Coastguard Worker /* A function used for serializing numbers (see json_set_number_serialization_function). 71*61046927SAndroid Build Coastguard Worker If 'buf' is null then it should return number of bytes that would've been written 72*61046927SAndroid Build Coastguard Worker (but not more than PARSON_NUM_BUF_SIZE). 73*61046927SAndroid Build Coastguard Worker */ 74*61046927SAndroid Build Coastguard Worker typedef int (*JSON_Number_Serialization_Function)(double num, char *buf); 75*61046927SAndroid Build Coastguard Worker 76*61046927SAndroid Build Coastguard Worker /* Call only once, before calling any other function from parson API. If not called, malloc and free 77*61046927SAndroid Build Coastguard Worker from stdlib will be used for all allocations */ 78*61046927SAndroid Build Coastguard Worker void json_set_allocation_functions(JSON_Malloc_Function malloc_fun, JSON_Free_Function free_fun); 79*61046927SAndroid Build Coastguard Worker 80*61046927SAndroid Build Coastguard Worker /* Sets if slashes should be escaped or not when serializing JSON. By default slashes are escaped. 81*61046927SAndroid Build Coastguard Worker This function sets a global setting and is not thread safe. */ 82*61046927SAndroid Build Coastguard Worker void json_set_escape_slashes(int escape_slashes); 83*61046927SAndroid Build Coastguard Worker 84*61046927SAndroid Build Coastguard Worker /* Sets float format used for serialization of numbers. 85*61046927SAndroid Build Coastguard Worker Make sure it can't serialize to a string longer than PARSON_NUM_BUF_SIZE. 86*61046927SAndroid Build Coastguard Worker If format is null then the default format is used. */ 87*61046927SAndroid Build Coastguard Worker void json_set_float_serialization_format(const char *format); 88*61046927SAndroid Build Coastguard Worker 89*61046927SAndroid Build Coastguard Worker /* Sets a function that will be used for serialization of numbers. 90*61046927SAndroid Build Coastguard Worker If function is null then the default serialization function is used. */ 91*61046927SAndroid Build Coastguard Worker void json_set_number_serialization_function(JSON_Number_Serialization_Function fun); 92*61046927SAndroid Build Coastguard Worker 93*61046927SAndroid Build Coastguard Worker /* Parses first JSON value in a file, returns NULL in case of error */ 94*61046927SAndroid Build Coastguard Worker JSON_Value * json_parse_file(const char *filename); 95*61046927SAndroid Build Coastguard Worker 96*61046927SAndroid Build Coastguard Worker /* Parses first JSON value in a file and ignores comments (/ * * / and //), 97*61046927SAndroid Build Coastguard Worker returns NULL in case of error */ 98*61046927SAndroid Build Coastguard Worker JSON_Value * json_parse_file_with_comments(const char *filename); 99*61046927SAndroid Build Coastguard Worker 100*61046927SAndroid Build Coastguard Worker /* Parses first JSON value in a string, returns NULL in case of error */ 101*61046927SAndroid Build Coastguard Worker JSON_Value * json_parse_string(const char *string); 102*61046927SAndroid Build Coastguard Worker 103*61046927SAndroid Build Coastguard Worker /* Parses first JSON value in a string and ignores comments (/ * * / and //), 104*61046927SAndroid Build Coastguard Worker returns NULL in case of error */ 105*61046927SAndroid Build Coastguard Worker JSON_Value * json_parse_string_with_comments(const char *string); 106*61046927SAndroid Build Coastguard Worker 107*61046927SAndroid Build Coastguard Worker /* Serialization */ 108*61046927SAndroid Build Coastguard Worker size_t json_serialization_size(const JSON_Value *value); /* returns 0 on fail */ 109*61046927SAndroid Build Coastguard Worker JSON_Status json_serialize_to_buffer(const JSON_Value *value, char *buf, size_t buf_size_in_bytes); 110*61046927SAndroid Build Coastguard Worker JSON_Status json_serialize_to_file(const JSON_Value *value, const char *filename); 111*61046927SAndroid Build Coastguard Worker char * json_serialize_to_string(const JSON_Value *value); 112*61046927SAndroid Build Coastguard Worker 113*61046927SAndroid Build Coastguard Worker /* Pretty serialization */ 114*61046927SAndroid Build Coastguard Worker size_t json_serialization_size_pretty(const JSON_Value *value); /* returns 0 on fail */ 115*61046927SAndroid Build Coastguard Worker JSON_Status json_serialize_to_buffer_pretty(const JSON_Value *value, char *buf, size_t buf_size_in_bytes); 116*61046927SAndroid Build Coastguard Worker JSON_Status json_serialize_to_file_pretty(const JSON_Value *value, const char *filename); 117*61046927SAndroid Build Coastguard Worker char * json_serialize_to_string_pretty(const JSON_Value *value); 118*61046927SAndroid Build Coastguard Worker 119*61046927SAndroid Build Coastguard Worker void json_free_serialized_string(char *string); /* frees string from json_serialize_to_string and json_serialize_to_string_pretty */ 120*61046927SAndroid Build Coastguard Worker 121*61046927SAndroid Build Coastguard Worker /* Comparing */ 122*61046927SAndroid Build Coastguard Worker int json_value_equals(const JSON_Value *a, const JSON_Value *b); 123*61046927SAndroid Build Coastguard Worker 124*61046927SAndroid Build Coastguard Worker /* Validation 125*61046927SAndroid Build Coastguard Worker This is *NOT* JSON Schema. It validates json by checking if object have identically 126*61046927SAndroid Build Coastguard Worker named fields with matching types. 127*61046927SAndroid Build Coastguard Worker For example schema {"name":"", "age":0} will validate 128*61046927SAndroid Build Coastguard Worker {"name":"Joe", "age":25} and {"name":"Joe", "age":25, "gender":"m"}, 129*61046927SAndroid Build Coastguard Worker but not {"name":"Joe"} or {"name":"Joe", "age":"Cucumber"}. 130*61046927SAndroid Build Coastguard Worker In case of arrays, only first value in schema is checked against all values in tested array. 131*61046927SAndroid Build Coastguard Worker Empty objects ({}) validate all objects, empty arrays ([]) validate all arrays, 132*61046927SAndroid Build Coastguard Worker null validates values of every type. 133*61046927SAndroid Build Coastguard Worker */ 134*61046927SAndroid Build Coastguard Worker JSON_Status json_validate(const JSON_Value *schema, const JSON_Value *value); 135*61046927SAndroid Build Coastguard Worker 136*61046927SAndroid Build Coastguard Worker /* 137*61046927SAndroid Build Coastguard Worker * JSON Object 138*61046927SAndroid Build Coastguard Worker */ 139*61046927SAndroid Build Coastguard Worker JSON_Value * json_object_get_value (const JSON_Object *object, const char *name); 140*61046927SAndroid Build Coastguard Worker const char * json_object_get_string (const JSON_Object *object, const char *name); 141*61046927SAndroid Build Coastguard Worker size_t json_object_get_string_len(const JSON_Object *object, const char *name); /* doesn't account for last null character */ 142*61046927SAndroid Build Coastguard Worker JSON_Object * json_object_get_object (const JSON_Object *object, const char *name); 143*61046927SAndroid Build Coastguard Worker JSON_Array * json_object_get_array (const JSON_Object *object, const char *name); 144*61046927SAndroid Build Coastguard Worker double json_object_get_number (const JSON_Object *object, const char *name); /* returns 0 on fail */ 145*61046927SAndroid Build Coastguard Worker int json_object_get_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */ 146*61046927SAndroid Build Coastguard Worker 147*61046927SAndroid Build Coastguard Worker /* dotget functions enable addressing values with dot notation in nested objects, 148*61046927SAndroid Build Coastguard Worker just like in structs or c++/java/c# objects (e.g. objectA.objectB.value). 149*61046927SAndroid Build Coastguard Worker Because valid names in JSON can contain dots, some values may be inaccessible 150*61046927SAndroid Build Coastguard Worker this way. */ 151*61046927SAndroid Build Coastguard Worker JSON_Value * json_object_dotget_value (const JSON_Object *object, const char *name); 152*61046927SAndroid Build Coastguard Worker const char * json_object_dotget_string (const JSON_Object *object, const char *name); 153*61046927SAndroid Build Coastguard Worker size_t json_object_dotget_string_len(const JSON_Object *object, const char *name); /* doesn't account for last null character */ 154*61046927SAndroid Build Coastguard Worker JSON_Object * json_object_dotget_object (const JSON_Object *object, const char *name); 155*61046927SAndroid Build Coastguard Worker JSON_Array * json_object_dotget_array (const JSON_Object *object, const char *name); 156*61046927SAndroid Build Coastguard Worker double json_object_dotget_number (const JSON_Object *object, const char *name); /* returns 0 on fail */ 157*61046927SAndroid Build Coastguard Worker int json_object_dotget_boolean(const JSON_Object *object, const char *name); /* returns -1 on fail */ 158*61046927SAndroid Build Coastguard Worker 159*61046927SAndroid Build Coastguard Worker /* Functions to get available names */ 160*61046927SAndroid Build Coastguard Worker size_t json_object_get_count (const JSON_Object *object); 161*61046927SAndroid Build Coastguard Worker const char * json_object_get_name (const JSON_Object *object, size_t index); 162*61046927SAndroid Build Coastguard Worker JSON_Value * json_object_get_value_at(const JSON_Object *object, size_t index); 163*61046927SAndroid Build Coastguard Worker JSON_Value * json_object_get_wrapping_value(const JSON_Object *object); 164*61046927SAndroid Build Coastguard Worker 165*61046927SAndroid Build Coastguard Worker /* Functions to check if object has a value with a specific name. Returned value is 1 if object has 166*61046927SAndroid Build Coastguard Worker * a value and 0 if it doesn't. dothas functions behave exactly like dotget functions. */ 167*61046927SAndroid Build Coastguard Worker int json_object_has_value (const JSON_Object *object, const char *name); 168*61046927SAndroid Build Coastguard Worker int json_object_has_value_of_type(const JSON_Object *object, const char *name, JSON_Value_Type type); 169*61046927SAndroid Build Coastguard Worker 170*61046927SAndroid Build Coastguard Worker int json_object_dothas_value (const JSON_Object *object, const char *name); 171*61046927SAndroid Build Coastguard Worker int json_object_dothas_value_of_type(const JSON_Object *object, const char *name, JSON_Value_Type type); 172*61046927SAndroid Build Coastguard Worker 173*61046927SAndroid Build Coastguard Worker /* Creates new name-value pair or frees and replaces old value with a new one. 174*61046927SAndroid Build Coastguard Worker * json_object_set_value does not copy passed value so it shouldn't be freed afterwards. */ 175*61046927SAndroid Build Coastguard Worker JSON_Status json_object_set_value(JSON_Object *object, const char *name, JSON_Value *value); 176*61046927SAndroid Build Coastguard Worker JSON_Status json_object_set_string(JSON_Object *object, const char *name, const char *string); 177*61046927SAndroid Build Coastguard Worker JSON_Status json_object_set_string_with_len(JSON_Object *object, const char *name, const char *string, size_t len); /* length shouldn't include last null character */ 178*61046927SAndroid Build Coastguard Worker JSON_Status json_object_set_number(JSON_Object *object, const char *name, double number); 179*61046927SAndroid Build Coastguard Worker JSON_Status json_object_set_boolean(JSON_Object *object, const char *name, int boolean); 180*61046927SAndroid Build Coastguard Worker JSON_Status json_object_set_null(JSON_Object *object, const char *name); 181*61046927SAndroid Build Coastguard Worker 182*61046927SAndroid Build Coastguard Worker /* Works like dotget functions, but creates whole hierarchy if necessary. 183*61046927SAndroid Build Coastguard Worker * json_object_dotset_value does not copy passed value so it shouldn't be freed afterwards. */ 184*61046927SAndroid Build Coastguard Worker JSON_Status json_object_dotset_value(JSON_Object *object, const char *name, JSON_Value *value); 185*61046927SAndroid Build Coastguard Worker JSON_Status json_object_dotset_string(JSON_Object *object, const char *name, const char *string); 186*61046927SAndroid Build Coastguard Worker JSON_Status json_object_dotset_string_with_len(JSON_Object *object, const char *name, const char *string, size_t len); /* length shouldn't include last null character */ 187*61046927SAndroid Build Coastguard Worker JSON_Status json_object_dotset_number(JSON_Object *object, const char *name, double number); 188*61046927SAndroid Build Coastguard Worker JSON_Status json_object_dotset_boolean(JSON_Object *object, const char *name, int boolean); 189*61046927SAndroid Build Coastguard Worker JSON_Status json_object_dotset_null(JSON_Object *object, const char *name); 190*61046927SAndroid Build Coastguard Worker 191*61046927SAndroid Build Coastguard Worker /* Frees and removes name-value pair */ 192*61046927SAndroid Build Coastguard Worker JSON_Status json_object_remove(JSON_Object *object, const char *name); 193*61046927SAndroid Build Coastguard Worker 194*61046927SAndroid Build Coastguard Worker /* Works like dotget function, but removes name-value pair only on exact match. */ 195*61046927SAndroid Build Coastguard Worker JSON_Status json_object_dotremove(JSON_Object *object, const char *key); 196*61046927SAndroid Build Coastguard Worker 197*61046927SAndroid Build Coastguard Worker /* Removes all name-value pairs in object */ 198*61046927SAndroid Build Coastguard Worker JSON_Status json_object_clear(JSON_Object *object); 199*61046927SAndroid Build Coastguard Worker 200*61046927SAndroid Build Coastguard Worker /* 201*61046927SAndroid Build Coastguard Worker *JSON Array 202*61046927SAndroid Build Coastguard Worker */ 203*61046927SAndroid Build Coastguard Worker JSON_Value * json_array_get_value (const JSON_Array *array, size_t index); 204*61046927SAndroid Build Coastguard Worker const char * json_array_get_string (const JSON_Array *array, size_t index); 205*61046927SAndroid Build Coastguard Worker size_t json_array_get_string_len(const JSON_Array *array, size_t index); /* doesn't account for last null character */ 206*61046927SAndroid Build Coastguard Worker JSON_Object * json_array_get_object (const JSON_Array *array, size_t index); 207*61046927SAndroid Build Coastguard Worker JSON_Array * json_array_get_array (const JSON_Array *array, size_t index); 208*61046927SAndroid Build Coastguard Worker double json_array_get_number (const JSON_Array *array, size_t index); /* returns 0 on fail */ 209*61046927SAndroid Build Coastguard Worker int json_array_get_boolean(const JSON_Array *array, size_t index); /* returns -1 on fail */ 210*61046927SAndroid Build Coastguard Worker size_t json_array_get_count (const JSON_Array *array); 211*61046927SAndroid Build Coastguard Worker JSON_Value * json_array_get_wrapping_value(const JSON_Array *array); 212*61046927SAndroid Build Coastguard Worker 213*61046927SAndroid Build Coastguard Worker /* Frees and removes value at given index, does nothing and returns JSONFailure if index doesn't exist. 214*61046927SAndroid Build Coastguard Worker * Order of values in array may change during execution. */ 215*61046927SAndroid Build Coastguard Worker JSON_Status json_array_remove(JSON_Array *array, size_t i); 216*61046927SAndroid Build Coastguard Worker 217*61046927SAndroid Build Coastguard Worker /* Frees and removes from array value at given index and replaces it with given one. 218*61046927SAndroid Build Coastguard Worker * Does nothing and returns JSONFailure if index doesn't exist. 219*61046927SAndroid Build Coastguard Worker * json_array_replace_value does not copy passed value so it shouldn't be freed afterwards. */ 220*61046927SAndroid Build Coastguard Worker JSON_Status json_array_replace_value(JSON_Array *array, size_t i, JSON_Value *value); 221*61046927SAndroid Build Coastguard Worker JSON_Status json_array_replace_string(JSON_Array *array, size_t i, const char* string); 222*61046927SAndroid Build Coastguard Worker JSON_Status json_array_replace_string_with_len(JSON_Array *array, size_t i, const char *string, size_t len); /* length shouldn't include last null character */ 223*61046927SAndroid Build Coastguard Worker JSON_Status json_array_replace_number(JSON_Array *array, size_t i, double number); 224*61046927SAndroid Build Coastguard Worker JSON_Status json_array_replace_boolean(JSON_Array *array, size_t i, int boolean); 225*61046927SAndroid Build Coastguard Worker JSON_Status json_array_replace_null(JSON_Array *array, size_t i); 226*61046927SAndroid Build Coastguard Worker 227*61046927SAndroid Build Coastguard Worker /* Frees and removes all values from array */ 228*61046927SAndroid Build Coastguard Worker JSON_Status json_array_clear(JSON_Array *array); 229*61046927SAndroid Build Coastguard Worker 230*61046927SAndroid Build Coastguard Worker /* Appends new value at the end of array. 231*61046927SAndroid Build Coastguard Worker * json_array_append_value does not copy passed value so it shouldn't be freed afterwards. */ 232*61046927SAndroid Build Coastguard Worker JSON_Status json_array_append_value(JSON_Array *array, JSON_Value *value); 233*61046927SAndroid Build Coastguard Worker JSON_Status json_array_append_string(JSON_Array *array, const char *string); 234*61046927SAndroid Build Coastguard Worker JSON_Status json_array_append_string_with_len(JSON_Array *array, const char *string, size_t len); /* length shouldn't include last null character */ 235*61046927SAndroid Build Coastguard Worker JSON_Status json_array_append_number(JSON_Array *array, double number); 236*61046927SAndroid Build Coastguard Worker JSON_Status json_array_append_boolean(JSON_Array *array, int boolean); 237*61046927SAndroid Build Coastguard Worker JSON_Status json_array_append_null(JSON_Array *array); 238*61046927SAndroid Build Coastguard Worker 239*61046927SAndroid Build Coastguard Worker /* 240*61046927SAndroid Build Coastguard Worker *JSON Value 241*61046927SAndroid Build Coastguard Worker */ 242*61046927SAndroid Build Coastguard Worker JSON_Value * json_value_init_object (void); 243*61046927SAndroid Build Coastguard Worker JSON_Value * json_value_init_array (void); 244*61046927SAndroid Build Coastguard Worker JSON_Value * json_value_init_string (const char *string); /* copies passed string */ 245*61046927SAndroid Build Coastguard Worker JSON_Value * json_value_init_string_with_len(const char *string, size_t length); /* copies passed string, length shouldn't include last null character */ 246*61046927SAndroid Build Coastguard Worker JSON_Value * json_value_init_number (double number); 247*61046927SAndroid Build Coastguard Worker JSON_Value * json_value_init_boolean(int boolean); 248*61046927SAndroid Build Coastguard Worker JSON_Value * json_value_init_null (void); 249*61046927SAndroid Build Coastguard Worker JSON_Value * json_value_deep_copy (const JSON_Value *value); 250*61046927SAndroid Build Coastguard Worker void json_value_free (JSON_Value *value); 251*61046927SAndroid Build Coastguard Worker 252*61046927SAndroid Build Coastguard Worker JSON_Value_Type json_value_get_type (const JSON_Value *value); 253*61046927SAndroid Build Coastguard Worker JSON_Object * json_value_get_object (const JSON_Value *value); 254*61046927SAndroid Build Coastguard Worker JSON_Array * json_value_get_array (const JSON_Value *value); 255*61046927SAndroid Build Coastguard Worker const char * json_value_get_string (const JSON_Value *value); 256*61046927SAndroid Build Coastguard Worker size_t json_value_get_string_len(const JSON_Value *value); /* doesn't account for last null character */ 257*61046927SAndroid Build Coastguard Worker double json_value_get_number (const JSON_Value *value); 258*61046927SAndroid Build Coastguard Worker int json_value_get_boolean(const JSON_Value *value); 259*61046927SAndroid Build Coastguard Worker JSON_Value * json_value_get_parent (const JSON_Value *value); 260*61046927SAndroid Build Coastguard Worker 261*61046927SAndroid Build Coastguard Worker /* Same as above, but shorter */ 262*61046927SAndroid Build Coastguard Worker JSON_Value_Type json_type (const JSON_Value *value); 263*61046927SAndroid Build Coastguard Worker JSON_Object * json_object (const JSON_Value *value); 264*61046927SAndroid Build Coastguard Worker JSON_Array * json_array (const JSON_Value *value); 265*61046927SAndroid Build Coastguard Worker const char * json_string (const JSON_Value *value); 266*61046927SAndroid Build Coastguard Worker size_t json_string_len(const JSON_Value *value); /* doesn't account for last null character */ 267*61046927SAndroid Build Coastguard Worker double json_number (const JSON_Value *value); 268*61046927SAndroid Build Coastguard Worker int json_boolean(const JSON_Value *value); 269*61046927SAndroid Build Coastguard Worker 270*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 271*61046927SAndroid Build Coastguard Worker } 272*61046927SAndroid Build Coastguard Worker #endif 273*61046927SAndroid Build Coastguard Worker 274*61046927SAndroid Build Coastguard Worker #endif 275