Парсон - это легкая библиотека JSON, написанная на C.
Бегать:
git clone https://github.com/kgabis/parson.git
и скопируйте parson.h и parson.c, дерево исходного кода.
Запустите make test для компиляции и запуска тестов.
Вот функция, которая печатает базовую информацию о коммите (дата, SHA и автор) из репозитория 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 );
} Вызов print_commits_info("torvalds", "linux"); Отпечатки:
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
...
В этом примере я использую Parson для сохранения пользовательской информации в файл, а затем загружаю ее и проверяю позже.
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 ;
}Создание значений JSON очень просто благодаря точечной нотации. Иерархия объекта автоматически создается при решении конкретных полей. В следующем примере я создаю простое значение JSON, содержащее основную информацию о человеке.
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 );
}Выход:
{
"name": "John Smith",
"age": 25,
"address": {
"city": "Cupertino"
},
"contact": {
"emails": [
"[email protected]",
"[email protected]"
]
}
}
Я всегда объединяю исправления рабочих ошибок. Однако, если вы хотите добавить что -то новое в API, пожалуйста, создайте «проблему» на GitHub для этого, чтобы мы могли обсудить, если он должен оказаться в библиотеке, прежде чем вы начнете ее реализовать. Не забудьте следовать стилю кода Парсона и написать подходящие тесты.
Лицензия MIT (MIT)