2022-08-06 15:39:29 -05:00
/*
SPDX - License - Identifier : MIT
Parson 1.4 .0 ( https : //github.com/kgabis/parson)
Copyright ( c ) 2012 - 2022 Krzysztof Gabis
Permission is hereby granted , free of charge , to any person obtaining a copy
of this software and associated documentation files ( the " Software " ) , to deal
in the Software without restriction , including without limitation the rights
to use , copy , modify , merge , publish , distribute , sublicense , and / or sell
copies of the Software , and to permit persons to whom the Software is
furnished to do so , subject to the following conditions :
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software .
THE SOFTWARE IS PROVIDED " AS IS " , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING FROM ,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE .
*/
# ifndef parson_parson_h
# define parson_parson_h
# ifdef __cplusplus
2023-05-12 13:22:05 -05:00
extern " C " {
2022-08-06 15:39:29 -05:00
# endif
#if 0
} /* unconfuse xcode */
# endif
# define PARSON_VERSION_MAJOR 1
# define PARSON_VERSION_MINOR 4
# define PARSON_VERSION_PATCH 0
# define PARSON_VERSION_STRING "1.4.0"
2023-05-12 13:22:05 -05:00
# include <stddef.h> /* size_t */
2022-08-06 15:39:29 -05:00
/* Types and enums */
typedef struct json_object_t JSON_Object ;
2023-05-12 13:22:05 -05:00
typedef struct json_array_t JSON_Array ;
typedef struct json_value_t JSON_Value ;
2022-08-06 15:39:29 -05:00
enum json_value_type {
2023-05-12 13:22:05 -05:00
JSONError = - 1 ,
JSONNull = 1 ,
JSONString = 2 ,
JSONNumber = 3 ,
JSONObject = 4 ,
JSONArray = 5 ,
JSONBoolean = 6
2022-08-06 15:39:29 -05:00
} ;
typedef int JSON_Value_Type ;
enum json_result_t {
2023-05-12 13:22:05 -05:00
JSONSuccess = 0 ,
JSONFailure = - 1
2022-08-06 15:39:29 -05:00
} ;
typedef int JSON_Status ;
2023-05-12 13:22:05 -05:00
typedef void * ( * JSON_Malloc_Function ) ( size_t ) ;
typedef void ( * JSON_Free_Function ) ( void * ) ;
2022-08-06 15:39:29 -05:00
/* Call only once, before calling any other function from parson API. If not called, malloc and free
from stdlib will be used for all allocations */
void json_set_allocation_functions ( JSON_Malloc_Function malloc_fun , JSON_Free_Function free_fun ) ;
/* Sets if slashes should be escaped or not when serializing JSON. By default slashes are escaped.
This function sets a global setting and is not thread safe . */
void json_set_escape_slashes ( int escape_slashes ) ;
/* Sets float format used for serialization of numbers.
Make sure it can ' t serialize to a string longer than PARSON_NUM_BUF_SIZE .
If format is null then the default format is used . */
void json_set_float_serialization_format ( const char * format ) ;
/* Parses first JSON value in a file, returns NULL in case of error */
2023-05-12 13:22:05 -05:00
JSON_Value * json_parse_file ( const char * filename ) ;
2022-08-06 15:39:29 -05:00
/* Parses first JSON value in a file and ignores comments (/ * * / and //),
returns NULL in case of error */
2023-05-12 13:22:05 -05:00
JSON_Value * json_parse_file_with_comments ( const char * filename ) ;
2022-08-06 15:39:29 -05:00
/* Parses first JSON value in a string, returns NULL in case of error */
2023-05-12 13:22:05 -05:00
JSON_Value * json_parse_string ( const char * string ) ;
2022-08-06 15:39:29 -05:00
/* Parses first JSON value in a string and ignores comments (/ * * / and //),
returns NULL in case of error */
2023-05-12 13:22:05 -05:00
JSON_Value * json_parse_string_with_comments ( const char * string ) ;
2022-08-06 15:39:29 -05:00
/* Serialization */
2023-05-12 13:22:05 -05:00
size_t json_serialization_size ( const JSON_Value * value ) ; /* returns 0 on fail */
2022-08-06 15:39:29 -05:00
JSON_Status json_serialize_to_buffer ( const JSON_Value * value , char * buf , size_t buf_size_in_bytes ) ;
JSON_Status json_serialize_to_file ( const JSON_Value * value , const char * filename ) ;
2023-05-12 13:22:05 -05:00
char * json_serialize_to_string ( const JSON_Value * value ) ;
2022-08-06 15:39:29 -05:00
/* Pretty serialization */
2023-05-12 13:22:05 -05:00
size_t json_serialization_size_pretty ( const JSON_Value * value ) ; /* returns 0 on fail */
2022-08-06 15:39:29 -05:00
JSON_Status json_serialize_to_buffer_pretty ( const JSON_Value * value , char * buf , size_t buf_size_in_bytes ) ;
JSON_Status json_serialize_to_file_pretty ( const JSON_Value * value , const char * filename ) ;
2023-05-12 13:22:05 -05:00
char * json_serialize_to_string_pretty ( const JSON_Value * value ) ;
2022-08-06 15:39:29 -05:00
2023-05-12 13:22:05 -05:00
void json_free_serialized_string ( char * string ) ; /* frees string from json_serialize_to_string and json_serialize_to_string_pretty */
2022-08-06 15:39:29 -05:00
/* Comparing */
2023-05-12 13:22:05 -05:00
int json_value_equals ( const JSON_Value * a , const JSON_Value * b ) ;
2022-08-06 15:39:29 -05:00
/* Validation
This is * NOT * JSON Schema . It validates json by checking if object have identically
named fields with matching types .
For example schema { " name " : " " , " age " : 0 } will validate
{ " name " : " Joe " , " age " : 25 } and { " name " : " Joe " , " age " : 25 , " gender " : " m " } ,
but not { " name " : " Joe " } or { " name " : " Joe " , " age " : " Cucumber " } .
In case of arrays , only first value in schema is checked against all values in tested array .
Empty objects ( { } ) validate all objects , empty arrays ( [ ] ) validate all arrays ,
null validates values of every type .
*/
JSON_Status json_validate ( const JSON_Value * schema , const JSON_Value * value ) ;
/*
* JSON Object
*/
2023-05-12 13:22:05 -05:00
JSON_Value * json_object_get_value ( const JSON_Object * object , const char * name ) ;
const char * json_object_get_string ( const JSON_Object * object , const char * name ) ;
size_t json_object_get_string_len ( const JSON_Object * object , const char * name ) ; /* doesn't account for last null character */
JSON_Object * json_object_get_object ( const JSON_Object * object , const char * name ) ;
JSON_Array * json_object_get_array ( const JSON_Object * object , const char * name ) ;
double json_object_get_number ( const JSON_Object * object , const char * name ) ; /* returns 0 on fail */
int json_object_get_boolean ( const JSON_Object * object , const char * name ) ; /* returns -1 on fail */
2022-08-06 15:39:29 -05:00
/* dotget functions enable addressing values with dot notation in nested objects,
just like in structs or c + + / java / c # objects ( e . g . objectA . objectB . value ) .
Because valid names in JSON can contain dots , some values may be inaccessible
this way . */
2023-05-12 13:22:05 -05:00
JSON_Value * json_object_dotget_value ( const JSON_Object * object , const char * name ) ;
const char * json_object_dotget_string ( const JSON_Object * object , const char * name ) ;
size_t json_object_dotget_string_len ( const JSON_Object * object , const char * name ) ; /* doesn't account for last null character */
JSON_Object * json_object_dotget_object ( const JSON_Object * object , const char * name ) ;
JSON_Array * json_object_dotget_array ( const JSON_Object * object , const char * name ) ;
double json_object_dotget_number ( const JSON_Object * object , const char * name ) ; /* returns 0 on fail */
int json_object_dotget_boolean ( const JSON_Object * object , const char * name ) ; /* returns -1 on fail */
2022-08-06 15:39:29 -05:00
/* Functions to get available names */
2023-05-12 13:22:05 -05:00
size_t json_object_get_count ( const JSON_Object * object ) ;
const char * json_object_get_name ( const JSON_Object * object , size_t index ) ;
JSON_Value * json_object_get_value_at ( const JSON_Object * object , size_t index ) ;
JSON_Value * json_object_get_wrapping_value ( const JSON_Object * object ) ;
2022-08-06 15:39:29 -05:00
/* Functions to check if object has a value with a specific name. Returned value is 1 if object has
* a value and 0 if it doesn ' t . dothas functions behave exactly like dotget functions . */
2023-05-12 13:22:05 -05:00
int json_object_has_value ( const JSON_Object * object , const char * name ) ;
2022-08-06 15:39:29 -05:00
int json_object_has_value_of_type ( const JSON_Object * object , const char * name , JSON_Value_Type type ) ;
2023-05-12 13:22:05 -05:00
int json_object_dothas_value ( const JSON_Object * object , const char * name ) ;
2022-08-06 15:39:29 -05:00
int json_object_dothas_value_of_type ( const JSON_Object * object , const char * name , JSON_Value_Type type ) ;
/* Creates new name-value pair or frees and replaces old value with a new one.
* json_object_set_value does not copy passed value so it shouldn ' t be freed afterwards . */
JSON_Status json_object_set_value ( JSON_Object * object , const char * name , JSON_Value * value ) ;
JSON_Status json_object_set_string ( JSON_Object * object , const char * name , const char * string ) ;
2023-05-12 13:22:05 -05:00
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 */
2022-08-06 15:39:29 -05:00
JSON_Status json_object_set_number ( JSON_Object * object , const char * name , double number ) ;
JSON_Status json_object_set_boolean ( JSON_Object * object , const char * name , int boolean ) ;
JSON_Status json_object_set_null ( JSON_Object * object , const char * name ) ;
/* Works like dotget functions, but creates whole hierarchy if necessary.
* json_object_dotset_value does not copy passed value so it shouldn ' t be freed afterwards . */
JSON_Status json_object_dotset_value ( JSON_Object * object , const char * name , JSON_Value * value ) ;
JSON_Status json_object_dotset_string ( JSON_Object * object , const char * name , const char * string ) ;
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 */
JSON_Status json_object_dotset_number ( JSON_Object * object , const char * name , double number ) ;
JSON_Status json_object_dotset_boolean ( JSON_Object * object , const char * name , int boolean ) ;
JSON_Status json_object_dotset_null ( JSON_Object * object , const char * name ) ;
/* Frees and removes name-value pair */
JSON_Status json_object_remove ( JSON_Object * object , const char * name ) ;
/* Works like dotget function, but removes name-value pair only on exact match. */
JSON_Status json_object_dotremove ( JSON_Object * object , const char * key ) ;
/* Removes all name-value pairs in object */
JSON_Status json_object_clear ( JSON_Object * object ) ;
/*
* JSON Array
*/
2023-05-12 13:22:05 -05:00
JSON_Value * json_array_get_value ( const JSON_Array * array , size_t index ) ;
const char * json_array_get_string ( const JSON_Array * array , size_t index ) ;
size_t json_array_get_string_len ( const JSON_Array * array , size_t index ) ; /* doesn't account for last null character */
JSON_Object * json_array_get_object ( const JSON_Array * array , size_t index ) ;
JSON_Array * json_array_get_array ( const JSON_Array * array , size_t index ) ;
double json_array_get_number ( const JSON_Array * array , size_t index ) ; /* returns 0 on fail */
int json_array_get_boolean ( const JSON_Array * array , size_t index ) ; /* returns -1 on fail */
size_t json_array_get_count ( const JSON_Array * array ) ;
JSON_Value * json_array_get_wrapping_value ( const JSON_Array * array ) ;
2022-08-06 15:39:29 -05:00
/* Frees and removes value at given index, does nothing and returns JSONFailure if index doesn't exist.
* Order of values in array may change during execution . */
JSON_Status json_array_remove ( JSON_Array * array , size_t i ) ;
/* Frees and removes from array value at given index and replaces it with given one.
* Does nothing and returns JSONFailure if index doesn ' t exist .
* json_array_replace_value does not copy passed value so it shouldn ' t be freed afterwards . */
JSON_Status json_array_replace_value ( JSON_Array * array , size_t i , JSON_Value * value ) ;
2023-05-12 13:22:05 -05:00
JSON_Status json_array_replace_string ( JSON_Array * array , size_t i , const char * string ) ;
2022-08-06 15:39:29 -05:00
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 */
JSON_Status json_array_replace_number ( JSON_Array * array , size_t i , double number ) ;
JSON_Status json_array_replace_boolean ( JSON_Array * array , size_t i , int boolean ) ;
JSON_Status json_array_replace_null ( JSON_Array * array , size_t i ) ;
/* Frees and removes all values from array */
JSON_Status json_array_clear ( JSON_Array * array ) ;
/* Appends new value at the end of array.
* json_array_append_value does not copy passed value so it shouldn ' t be freed afterwards . */
JSON_Status json_array_append_value ( JSON_Array * array , JSON_Value * value ) ;
JSON_Status json_array_append_string ( JSON_Array * array , const char * string ) ;
JSON_Status json_array_append_string_with_len ( JSON_Array * array , const char * string , size_t len ) ; /* length shouldn't include last null character */
JSON_Status json_array_append_number ( JSON_Array * array , double number ) ;
JSON_Status json_array_append_boolean ( JSON_Array * array , int boolean ) ;
JSON_Status json_array_append_null ( JSON_Array * array ) ;
/*
* JSON Value
*/
2023-05-12 13:22:05 -05:00
JSON_Value * json_value_init_object ( void ) ;
JSON_Value * json_value_init_array ( void ) ;
JSON_Value * json_value_init_string ( const char * string ) ; /* copies passed string */
JSON_Value * json_value_init_string_with_len ( const char * string , size_t length ) ; /* copies passed string, length shouldn't include last null character */
JSON_Value * json_value_init_number ( double number ) ;
JSON_Value * json_value_init_boolean ( int boolean ) ;
JSON_Value * json_value_init_null ( void ) ;
JSON_Value * json_value_deep_copy ( const JSON_Value * value ) ;
void json_value_free ( JSON_Value * value ) ;
JSON_Value_Type json_value_get_type ( const JSON_Value * value ) ;
JSON_Object * json_value_get_object ( const JSON_Value * value ) ;
JSON_Array * json_value_get_array ( const JSON_Value * value ) ;
const char * json_value_get_string ( const JSON_Value * value ) ;
size_t json_value_get_string_len ( const JSON_Value * value ) ; /* doesn't account for last null character */
double json_value_get_number ( const JSON_Value * value ) ;
int json_value_get_boolean ( const JSON_Value * value ) ;
JSON_Value * json_value_get_parent ( const JSON_Value * value ) ;
2022-08-06 15:39:29 -05:00
/* Same as above, but shorter */
2023-05-12 13:22:05 -05:00
JSON_Value_Type json_type ( const JSON_Value * value ) ;
JSON_Object * json_object ( const JSON_Value * value ) ;
JSON_Array * json_array ( const JSON_Value * value ) ;
const char * json_string ( const JSON_Value * value ) ;
size_t json_string_len ( const JSON_Value * value ) ; /* doesn't account for last null character */
double json_number ( const JSON_Value * value ) ;
int json_boolean ( const JSON_Value * value ) ;
2022-08-06 15:39:29 -05:00
# ifdef __cplusplus
}
# endif
# endif