-
Notifications
You must be signed in to change notification settings - Fork 2.7k
Home
branch | Travis CI | AppVeyor |
---|---|---|
master |
||
0.y.z |
JSON (JavaScript Object Notation) is a lightweight data-interchange format. It can represent integer, real number, string, an ordered sequence of value, and a collection of name/value pairs.
Here is an example of JSON data:
{
"my-encoding" : "UTF-8",
"my-plug-ins" : [
"python",
"c++",
"ruby"
],
"my-indent" : { "length": 3, "use_space": true }
}
And here it is with comments:
// Configuration options
{
// Default encoding for text
"my-encoding" : "UTF-8",
// Plug-ins loaded at start-up
"my-plug-ins" : [
"python",
"c++",
"ruby"
],
// Tab indent size
"my-indent" : { "length" : 3, "use_space": true }
}
- Read and write JSON document.
- Attach C and C++ style comments to element during parsing.
- Rewrite JSON document preserving original comments.
#include <json/json.h>
Json::Value root; // starts as "null"; will contain the root value after parsing
std::cin >> root;
// Get the value of the member of root named 'my-encoding', return 'UTF-32' if there is no
// such member.
std::string my_encoding = root.get("my-encoding", "UTF-32" ).asString();
// Get the value of the member of root named 'my-plug-ins'; return a 'null' value if
// there is no such member.
const Json::Value my_plugins = root["my-plug-ins"];
for ( int index = 0; index < my_plugins.size(); ++index ) // Iterates over the sequence elements.
yourlib::loadPlugIn( my_plugins[index].asString() );
yourlib::setIndentLength( root["my-indent"].get("length", 3).asInt() );
yourlib::setIndentUseSpace( root["my-indent"].get("use_space", true).asBool() );
// ...
// At application shutdown to make the new configuration document:
// Since Json::Value has implicit constructor for all value types, it is not
// necessary to explicitly construct the Json::Value object:
root["encoding"] = yourlib::getCurrentEncoding();
root["indent"]["length"] = yourlib::getCurrentIndentLength();
root["indent"]["use_space"] = yourlib::getCurrentIndentUseSpace();
// Make a new JSON document with the new configuration. Preserve original comments.
std::cout << root << "\n";
You can also read from a file, e.g.:
#include <fstream>
std::ifstream config_doc("config_doc.json", std::ifstream::binary);
config_doc >> root;
If you need some unusual features, use Builders:
Json::Value root;
Json::CharReaderBuilder rbuilder;
// Configure the Builder, then ...
std::string errs;
bool parsingSuccessful = Json::parseFromStream(rbuilder, config_doc, &root, &errs);
if (!parsingSuccessful)
{
// report to the user the failure and their locations in the document.
std::cout << "Failed to parse configuration\n"
<< errs;
return;
}
// ...
Json::StreamWriterBuilder wbuilder;
// Configure the Builder, then ...
std::string outputConfig = Json::writeString(wbuilder, root);
Comments used to be supported in JSON but where removed for portability (C-like comments are not supported in Python). Since comments are useful in configuration/input file, this feature is preserved in jsoncpp
.
Current build instructions are located in the file README.md
in the top-directory of the project.
For other build systems, see Building.
See the release notes.
Older news can be found in News.
- JSON Specification and alternate language implementations.
- YAML A data format designed for human readability.
- UTF-8 and Unicode FAQ.
- https://sourceforge.net/projects/jsoncpp/ (aka 'json-cpp')
- http://jsoncpp.sourceforge.net
- http://sourceforge.net/projects/jsoncpp/files/
- http://jsoncpp.svn.sourceforge.net/svnroot/jsoncpp/trunk/
- http://jsoncpp.sourceforge.net/old.html
See file LICENSE
in the top-directory of the project.
Basically JsonCpp is licensed under MIT license, or public domain if desired and recognized in your jurisdiction.