Parson es una biblioteca JSON ligera escrita en C.
Correr:
git clone https://github.com/kgabis/parson.git
y copiar parson.h y parson.c al árbol de código fuente.
Ejecute make test para compilar y ejecutar pruebas.
Aquí hay una función, que imprime información básica de confirmación (fecha, SHA y autor) desde un repositorio de GitHub.
void print_commits_info ( const char * username , const char * repo ) {
JSON_Value * root_value ;
JSON_Array * commits ;
JSON_Object * commit ;
size_t i ;
char curl_command [ 512 ];
char cleanup_command [ 256 ];
char output_filename [] = "commits.json" ;
/* it ain't pretty, but it's not a libcurl tutorial */
sprintf ( curl_command ,
"curl -s "https://api.github.com/repos/%s/%s/commits" > %s" ,
username , repo , output_filename );
sprintf ( cleanup_command , "rm -f %s" , output_filename );
system ( curl_command );
/* parsing json and validating output */
root_value = json_parse_file ( output_filename );
if ( json_value_get_type ( root_value ) != JSONArray ) {
system ( cleanup_command );
return ;
}
/* getting array from root value and printing commit info */
commits = json_value_get_array ( root_value );
printf ( "%-10.10s %-10.10s %sn" , "Date" , "SHA" , "Author" );
for ( i = 0 ; i < json_array_get_count ( commits ); i ++ ) {
commit = json_array_get_object ( commits , i );
printf ( "%.10s %.10s %sn" ,
json_object_dotget_string ( commit , "commit.author.date" ),
json_object_get_string ( commit , "sha" ),
json_object_dotget_string ( commit , "commit.author.name" ));
}
/* cleanup code */
json_value_free ( root_value );
system ( cleanup_command );
} Llamar print_commits_info("torvalds", "linux"); huellas dactilares:
Date SHA Author
2012-10-15 dd8e8c4a2c David Rientjes
2012-10-15 3ce9e53e78 Michal Marek
2012-10-14 29bb4cc5e0 Randy Dunlap
2012-10-15 325adeb55e Ralf Baechle
2012-10-14 68687c842c Russell King
2012-10-14 ddffeb8c4d Linus Torvalds
...
En este ejemplo, estoy usando a Parson para guardar información del usuario en un archivo y luego cargarla y validar más tarde.
void persistence_example ( void ) {
JSON_Value * schema = json_parse_string ( "{"name":""}" );
JSON_Value * user_data = json_parse_file ( "user_data.json" );
char buf [ 256 ];
const char * name = NULL ;
if ( user_data == NULL || json_validate ( schema , user_data ) != JSONSuccess ) {
puts ( "Enter your name:" );
scanf ( "%s" , buf );
user_data = json_value_init_object ();
json_object_set_string ( json_object ( user_data ), "name" , buf );
json_serialize_to_file ( user_data , "user_data.json" );
}
name = json_object_get_string ( json_object ( user_data ), "name" );
printf ( "Hello, %s." , name );
json_value_free ( schema );
json_value_free ( user_data );
return ;
}Crear valores JSON es muy simple gracias a la notación de puntos. La jerarquía de objetos se crea automáticamente al abordar campos específicos. En el siguiente ejemplo, creo un valor JSON simple que contiene información básica sobre una persona.
void serialization_example ( void ) {
JSON_Value * root_value = json_value_init_object ();
JSON_Object * root_object = json_value_get_object ( root_value );
char * serialized_string = NULL ;
json_object_set_string ( root_object , "name" , "John Smith" );
json_object_set_number ( root_object , "age" , 25 );
json_object_dotset_string ( root_object , "address.city" , "Cupertino" );
json_object_dotset_value ( root_object , "contact.emails" , json_parse_string ( "["[email protected]","[email protected]"]" ));
serialized_string = json_serialize_to_string_pretty ( root_value );
puts ( serialized_string );
json_free_serialized_string ( serialized_string );
json_value_free ( root_value );
}Producción:
{
"name": "John Smith",
"age": 25,
"address": {
"city": "Cupertino"
},
"contact": {
"emails": [
"[email protected]",
"[email protected]"
]
}
}
Siempre fusionaré correcciones de errores. Sin embargo, si desea agregar algo nuevo a la API, cree un "problema" en GitHub para este primero para que podamos discutir si debe terminar en la biblioteca antes de comenzar a implementarlo. Recuerde seguir el estilo de código de Parson y escribir pruebas apropiadas.
La licencia del MIT (MIT)