2015-06-22 17:31:01 +00:00
<!DOCTYPE html>
< html lang = "en-us" >
2012-10-16 18:12:50 +00:00
< head >
2015-06-22 17:31:01 +00:00
< meta charset = "UTF-8" >
2014-10-08 07:59:59 +00:00
< title > parson by kgabis< / title >
2015-06-22 17:31:01 +00:00
< meta name = "viewport" content = "width=device-width, initial-scale=1" >
< link rel = "stylesheet" type = "text/css" href = "stylesheets/normalize.css" media = "screen" >
< link href = 'http://fonts.googleapis.com/css?family=Open+Sans:400,700' rel = 'stylesheet' type = 'text/css' >
< link rel = "stylesheet" type = "text/css" href = "stylesheets/stylesheet.css" media = "screen" >
< link rel = "stylesheet" type = "text/css" href = "stylesheets/github-light.css" media = "screen" >
2012-10-16 18:12:50 +00:00
< / head >
< body >
2015-06-22 17:31:01 +00:00
< section class = "page-header" >
< h1 class = "project-name" > parson< / h1 >
< h2 class = "project-tagline" > Lightweight json library written in C.< / h2 >
< a href = "https://github.com/kgabis/parson" class = "btn" > View on GitHub< / a >
< a href = "https://github.com/kgabis/parson/zipball/master" class = "btn" > Download .zip< / a >
< a href = "https://github.com/kgabis/parson/tarball/master" class = "btn" > Download .tar.gz< / a >
< / section >
< section class = "main-content" >
< h2 >
2014-11-24 20:05:13 +00:00
< a id = "about" class = "anchor" href = "#about" aria-hidden = "true" > < span class = "octicon octicon-link" > < / span > < / a > About< / h2 >
2012-10-16 18:12:50 +00:00
2014-10-08 07:59:59 +00:00
< p > Parson is a lighweight < a href = "http://json.org" > json< / a > library written in C.< / p >
2012-10-16 18:12:50 +00:00
2014-10-08 07:59:59 +00:00
< h2 >
2014-11-24 20:05:13 +00:00
< a id = "features" class = "anchor" href = "#features" aria-hidden = "true" > < span class = "octicon octicon-link" > < / span > < / a > Features< / h2 >
2012-10-16 18:12:50 +00:00
< ul >
2014-10-08 07:59:59 +00:00
< li > Full JSON support< / li >
2012-10-22 17:22:41 +00:00
< li > Lightweight (only 2 files)< / li >
2012-10-16 18:12:50 +00:00
< li > Simple API< / li >
< li > Addressing json values with dot notation (similiar to C structs or objects in most OO languages, e.g. "objectA.objectB.value")< / li >
< li > C89 compatible< / li >
< li > Test suites< / li >
2014-11-24 20:05:13 +00:00
< / ul >
< h2 >
< a id = "installation" class = "anchor" href = "#installation" aria-hidden = "true" > < span class = "octicon octicon-link" > < / span > < / a > Installation< / h2 >
2012-10-16 18:12:50 +00:00
2014-10-08 07:59:59 +00:00
< p > Run:< / p >
2012-10-16 18:12:50 +00:00
2012-10-18 19:38:29 +00:00
< pre > < code > git clone https://github.com/kgabis/parson.git
2012-10-16 18:12:50 +00:00
< / code > < / pre >
< p > and copy parson.h and parson.c to you source code tree.< / p >
2012-12-02 21:25:33 +00:00
< p > Run < code > make test< / code > to compile and run tests.< / p >
2012-10-22 17:22:41 +00:00
2014-10-08 07:59:59 +00:00
< h2 >
2014-11-24 20:05:13 +00:00
< a id = "examples" class = "anchor" href = "#examples" aria-hidden = "true" > < span class = "octicon octicon-link" > < / span > < / a > Examples< / h2 >
2014-10-08 07:59:59 +00:00
< h3 >
2014-11-24 20:05:13 +00:00
< a id = "parsing-json" class = "anchor" href = "#parsing-json" aria-hidden = "true" > < span class = "octicon octicon-link" > < / span > < / a > Parsing JSON< / h3 >
2012-10-16 18:12:50 +00:00
2014-10-08 07:59:59 +00:00
< p > Here is a function, which prints basic commit info (date, sha and author) from a github repository. < / p >
2012-10-16 18:12:50 +00:00
2015-06-22 17:31:01 +00:00
< div class = "highlight highlight-c" > < pre > < span class = "pl-k" > void< / span > < span class = "pl-en" > print_commits_info< / span > (< span class = "pl-k" > const< / span > < span class = "pl-k" > char< / span > *username, < span class = "pl-k" > const< / span > < span class = "pl-k" > char< / span > *repo) {
2014-11-24 20:05:13 +00:00
JSON_Value *root_value;
JSON_Array *commits;
JSON_Object *commit;
2015-06-22 17:31:01 +00:00
< span class = "pl-c1" > size_t< / span > i;
2014-11-24 20:05:13 +00:00
2015-06-22 17:31:01 +00:00
< span class = "pl-k" > char< / span > curl_command[< span class = "pl-c1" > 512< / span > ];
< span class = "pl-k" > char< / span > cleanup_command[< span class = "pl-c1" > 256< / span > ];
< span class = "pl-k" > char< / span > output_filename[] = < span class = "pl-s" > < span class = "pl-pds" > "< / span > commits.json< span class = "pl-pds" > "< / span > < / span > ;
2014-11-24 20:05:13 +00:00
< span class = "pl-c" > /* it ain't pretty, but it's not a libcurl tutorial */< / span >
2015-06-22 17:31:01 +00:00
< span class = "pl-c1" > sprintf< / span > (curl_command,
< span class = "pl-s" > < span class = "pl-pds" > "< / span > curl -s < span class = "pl-cce" > \"< / span > https://api.github.com/repos/< span class = "pl-c1" > %s< / span > /< span class = "pl-c1" > %s< / span > /commits< span class = "pl-cce" > \"< / span > > < span class = "pl-c1" > %s< / span > < span class = "pl-pds" > "< / span > < / span > ,
2014-11-24 20:05:13 +00:00
username, repo, output_filename);
2015-06-22 17:31:01 +00:00
< span class = "pl-c1" > sprintf< / span > (cleanup_command, < span class = "pl-s" > < span class = "pl-pds" > "< / span > rm -f < span class = "pl-c1" > %s< / span > < span class = "pl-pds" > "< / span > < / span > , output_filename);
< span class = "pl-c1" > system< / span > (curl_command);
2014-11-24 20:05:13 +00:00
< span class = "pl-c" > /* parsing json and validating output */< / span >
2015-06-22 17:31:01 +00:00
root_value = < span class = "pl-c1" > json_parse_file< / span > (output_filename);
< span class = "pl-k" > if< / span > (< span class = "pl-c1" > json_value_get_type< / span > (root_value) != JSONArray) {
< span class = "pl-c1" > system< / span > (cleanup_command);
2014-11-24 20:05:13 +00:00
< span class = "pl-k" > return< / span > ;
}
< span class = "pl-c" > /* getting array from root value and printing commit info */< / span >
2015-06-22 17:31:01 +00:00
commits = < span class = "pl-c1" > json_value_get_array< / span > (root_value);
< span class = "pl-c1" > printf< / span > (< span class = "pl-s" > < span class = "pl-pds" > "< / span > < span class = "pl-c1" > %-10.10s< / span > < span class = "pl-c1" > %-10.10s< / span > < span class = "pl-c1" > %s< / span > < span class = "pl-cce" > \n< / span > < span class = "pl-pds" > "< / span > < / span > , < span class = "pl-s" > < span class = "pl-pds" > "< / span > Date< span class = "pl-pds" > "< / span > < / span > , < span class = "pl-s" > < span class = "pl-pds" > "< / span > SHA< span class = "pl-pds" > "< / span > < / span > , < span class = "pl-s" > < span class = "pl-pds" > "< / span > Author< span class = "pl-pds" > "< / span > < / span > );
< span class = "pl-k" > for< / span > (i = < span class = "pl-c1" > 0< / span > ; i < < span class = "pl-c1" > json_array_get_count< / span > (commits); i++) {
commit = < span class = "pl-c1" > json_array_get_object< / span > (commits, i);
< span class = "pl-c1" > printf< / span > (< span class = "pl-s" > < span class = "pl-pds" > "< / span > < span class = "pl-c1" > %.10s< / span > < span class = "pl-c1" > %.10s< / span > < span class = "pl-c1" > %s< / span > < span class = "pl-cce" > \n< / span > < span class = "pl-pds" > "< / span > < / span > ,
< span class = "pl-c1" > json_object_dotget_string< / span > (commit, < span class = "pl-s" > < span class = "pl-pds" > "< / span > commit.author.date< span class = "pl-pds" > "< / span > < / span > ),
< span class = "pl-c1" > json_object_get_string< / span > (commit, < span class = "pl-s" > < span class = "pl-pds" > "< / span > sha< span class = "pl-pds" > "< / span > < / span > ),
< span class = "pl-c1" > json_object_dotget_string< / span > (commit, < span class = "pl-s" > < span class = "pl-pds" > "< / span > commit.author.name< span class = "pl-pds" > "< / span > < / span > ));
2014-11-24 20:05:13 +00:00
}
< span class = "pl-c" > /* cleanup code */< / span >
2015-06-22 17:31:01 +00:00
< span class = "pl-c1" > json_value_free< / span > (root_value);
< span class = "pl-c1" > system< / span > (cleanup_command);
2014-11-24 20:05:13 +00:00
}
2012-10-16 18:12:50 +00:00
< / pre > < / div >
2012-10-22 17:22:41 +00:00
< p > Calling < code > print_commits_info("torvalds", "linux");< / code > prints: < / p >
2012-10-16 18:12:50 +00:00
< pre > < code > 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
...
< / code > < / pre >
2014-10-08 07:59:59 +00:00
< h3 >
2014-11-24 20:05:13 +00:00
< a id = "persistence" class = "anchor" href = "#persistence" aria-hidden = "true" > < span class = "octicon octicon-link" > < / span > < / a > Persistence< / h3 >
2014-10-08 07:59:59 +00:00
< p > In this example I'm using parson to save user information to a file and then load it and validate later.< / p >
2015-06-22 17:31:01 +00:00
< div class = "highlight highlight-c" > < pre > < span class = "pl-k" > void< / span > < span class = "pl-en" > persistence_example< / span > (< span class = "pl-k" > void< / span > ) {
JSON_Value *schema = < span class = "pl-c1" > json_parse_string< / span > (< span class = "pl-s" > < span class = "pl-pds" > "< / span > {< span class = "pl-cce" > \"< / span > name< span class = "pl-cce" > \"< / span > :< span class = "pl-cce" > \"\"< / span > }< span class = "pl-pds" > "< / span > < / span > );
JSON_Value *user_data = < span class = "pl-c1" > json_parse_file< / span > (< span class = "pl-s" > < span class = "pl-pds" > "< / span > user_data.json< span class = "pl-pds" > "< / span > < / span > );
< span class = "pl-k" > char< / span > buf[< span class = "pl-c1" > 256< / span > ];
< span class = "pl-k" > const< / span > < span class = "pl-k" > char< / span > *name = < span class = "pl-c1" > NULL< / span > ;
< span class = "pl-k" > if< / span > (user_data == < span class = "pl-c1" > NULL< / span > || < span class = "pl-c1" > json_validate< / span > (schema, user_data) != JSONSuccess) {
< span class = "pl-c1" > puts< / span > (< span class = "pl-s" > < span class = "pl-pds" > "< / span > Enter your name:< span class = "pl-pds" > "< / span > < / span > );
< span class = "pl-c1" > scanf< / span > (< span class = "pl-s" > < span class = "pl-pds" > "< / span > < span class = "pl-c1" > %s< / span > < span class = "pl-pds" > "< / span > < / span > , buf);
user_data = < span class = "pl-c1" > json_value_init_object< / span > ();
< span class = "pl-c1" > json_object_set_string< / span > (< span class = "pl-c1" > json_object< / span > (user_data), < span class = "pl-s" > < span class = "pl-pds" > "< / span > name< span class = "pl-pds" > "< / span > < / span > , buf);
< span class = "pl-c1" > json_serialize_to_file< / span > (user_data, < span class = "pl-s" > < span class = "pl-pds" > "< / span > user_data.json< span class = "pl-pds" > "< / span > < / span > );
2014-11-24 20:05:13 +00:00
}
2015-06-22 17:31:01 +00:00
name = < span class = "pl-c1" > json_object_get_string< / span > (< span class = "pl-c1" > json_object< / span > (user_data), < span class = "pl-s" > < span class = "pl-pds" > "< / span > name< span class = "pl-pds" > "< / span > < / span > );
< span class = "pl-c1" > printf< / span > (< span class = "pl-s" > < span class = "pl-pds" > "< / span > Hello, < span class = "pl-c1" > %s< / span > .< span class = "pl-pds" > "< / span > < / span > , name);
< span class = "pl-c1" > json_value_free< / span > (schema);
< span class = "pl-c1" > json_value_free< / span > (user_data);
2014-11-24 20:05:13 +00:00
< span class = "pl-k" > return< / span > ;
}< / pre > < / div >
2012-10-16 18:12:50 +00:00
2014-10-08 07:59:59 +00:00
< h3 >
2014-11-24 20:05:13 +00:00
< a id = "serialization" class = "anchor" href = "#serialization" aria-hidden = "true" > < span class = "octicon octicon-link" > < / span > < / a > Serialization< / h3 >
2014-10-08 07:59:59 +00:00
< p > Creating JSON values is very simple thanks to the dot notation.
Object hierarchy is automatically created when addressing specific fields.
In the following example I create a simple JSON value containing basic information about a person.< / p >
2015-06-22 17:31:01 +00:00
< div class = "highlight highlight-c" > < pre > < span class = "pl-k" > void< / span > < span class = "pl-en" > serialization_example< / span > (< span class = "pl-k" > void< / span > ) {
JSON_Value *root_value = < span class = "pl-c1" > json_value_init_object< / span > ();
JSON_Object *root_object = < span class = "pl-c1" > json_value_get_object< / span > (root_value);
< span class = "pl-k" > char< / span > *serialized_string = < span class = "pl-c1" > NULL< / span > ;
< span class = "pl-c1" > json_object_set_string< / span > (root_object, < span class = "pl-s" > < span class = "pl-pds" > "< / span > name< span class = "pl-pds" > "< / span > < / span > , < span class = "pl-s" > < span class = "pl-pds" > "< / span > John Smith< span class = "pl-pds" > "< / span > < / span > );
< span class = "pl-c1" > json_object_set_number< / span > (root_object, < span class = "pl-s" > < span class = "pl-pds" > "< / span > age< span class = "pl-pds" > "< / span > < / span > , < span class = "pl-c1" > 25< / span > );
< span class = "pl-c1" > json_object_dotset_string< / span > (root_object, < span class = "pl-s" > < span class = "pl-pds" > "< / span > address.city< span class = "pl-pds" > "< / span > < / span > , < span class = "pl-s" > < span class = "pl-pds" > "< / span > Cupertino< span class = "pl-pds" > "< / span > < / span > );
< span class = "pl-c1" > json_object_dotset_value< / span > (root_object, < span class = "pl-s" > < span class = "pl-pds" > "< / span > contact.emails< span class = "pl-pds" > "< / span > < / span > , < span class = "pl-c1" > json_parse_string< / span > (< span class = "pl-s" > < span class = "pl-pds" > "< / span > [< span class = "pl-cce" > \"< / span > email@example.com< span class = "pl-cce" > \"< / span > ,< span class = "pl-cce" > \"< / span > email2@example.com< span class = "pl-cce" > \"< / span > ]< span class = "pl-pds" > "< / span > < / span > ));
serialized_string = < span class = "pl-c1" > json_serialize_to_string_pretty< / span > (root_value);
< span class = "pl-c1" > puts< / span > (serialized_string);
< span class = "pl-c1" > json_free_serialized_string< / span > (serialized_string);
< span class = "pl-c1" > json_value_free< / span > (root_value);
2014-11-24 20:05:13 +00:00
}
2014-10-08 07:59:59 +00:00
< / pre > < / div >
2015-06-22 17:31:01 +00:00
< p > Output:< / p >
< pre > < code > {
"name": "John Smith",
"age": 25,
"address": {
"city": "Cupertino"
},
"contact": {
"emails": [
"email@example.com",
"email2@example.com"
]
}
2014-10-08 07:59:59 +00:00
}
< / code > < / pre >
< h2 >
2014-11-24 20:05:13 +00:00
< a id = "contributing" class = "anchor" href = "#contributing" aria-hidden = "true" > < span class = "octicon octicon-link" > < / span > < / a > Contributing< / h2 >
2014-10-08 07:59:59 +00:00
< p > I will always merge < em > working< / em > bug fixes. However, if you want to add something to the API,
I < em > won't< / em > merge it without prior discussion.
Remember to follow parson's code style and write appropriate tests.< / p >
2012-10-16 18:12:50 +00:00
2014-10-08 07:59:59 +00:00
< h2 >
2014-11-24 20:05:13 +00:00
< a id = "license" class = "anchor" href = "#license" aria-hidden = "true" > < span class = "octicon octicon-link" > < / span > < / a > License< / h2 >
2014-10-08 07:59:59 +00:00
< p > < a href = "http://opensource.org/licenses/mit-license.php" > The MIT License (MIT)< / a > < / p >
2015-06-22 17:31:01 +00:00
< footer class = "site-footer" >
< span class = "site-footer-owner" > < a href = "https://github.com/kgabis/parson" > parson< / a > is maintained by < a href = "https://github.com/kgabis" > kgabis< / a > .< / span >
< span class = "site-footer-credits" > This page was generated by < a href = "https://pages.github.com" > GitHub Pages< / a > using the < a href = "https://github.com/jasonlong/cayman-theme" > Cayman theme< / a > by < a href = "https://twitter.com/jasonlong" > Jason Long< / a > .< / span >
2014-10-08 07:59:59 +00:00
< / footer >
2015-06-22 17:31:01 +00:00
< / section >
< script type = "text/javascript" >
2012-10-16 18:12:50 +00:00
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
< / script >
< script type = "text/javascript" >
try {
var pageTracker = _gat._getTracker("UA-35563760-2");
pageTracker._trackPageview();
} catch(err) {}
< / script >
< / body >
2014-10-08 07:59:59 +00:00
< / html >
2015-06-22 17:31:01 +00:00