Introduction
JSON (JavaScript Object Notation) is a lightweight data-interchange format.
Here is an example of JSON data:
{
"encoding" : "UTF-8",
"plug-ins" : [
"python",
"c++",
"ruby"
],
"indent" : { "length" : 3, "use_space": true }
}
JsonCpp supports comments as meta-data:
{
"encoding" : "UTF-8",
"plug-ins" : [
"python",
"c++",
"ruby"
],
"indent" : { "length" : 3, "use_space": true }
}
Features
- read and write JSON document
- attach C++ style comments to element during parsing
- rewrite JSON document preserving original comments
Notes: Comments used to be supported in JSON but were removed for portability (C like comments are not supported in Python). Since comments are useful in configuration/input file, this feature was preserved.
Code example
std::cin >> root;
std::cin >> root["subtree"];
std::string encoding = root.
get(
"encoding",
"UTF-8" ).
asString();
for (
int index = 0; index < plugins.
size(); ++index )
loadPlugIn( plugins[index].asString() );
foo::setIndentLength( root["indent"].get("length", 3).asInt() );
foo::setIndentUseSpace( root["indent"].get("use_space", true).asBool() );
root["encoding"] = foo::getCurrentEncoding();
root["indent"]["length"] = foo::getCurrentIndentLength();
root["indent"]["use_space"] = foo::getCurrentIndentUseSpace();
std::cout << root;
std::cout << std::endl;
Value get(ArrayIndex index, const Value &defaultValue) const
If the array contains at least index+1 elements, returns the element value, otherwise returns default...
ArrayIndex size() const
Number of values in array or object.
String asString() const
Embedded zeroes are possible.
Advanced usage
Configure builders to create readers and writers. For configuration, we use our own Json::Value (rather than standard setters/getters) so that we can add features without losing binary-compatibility.
wbuilder["indentation"] = "\t";
rbuilder["collectComments"] = false;
std::string errs;
Build a CharReader implementation.
Build a StreamWriter implementation.
String writeString(StreamWriter::Factory const &factory, Value const &root)
Write into stringstream, then return string, for convenience.
bool parseFromStream(CharReader::Factory const &, IStream &, Value *root, String *errs)
Consume entire stream and use its begin/end.
Yes, compile-time configuration-checking would be helpful, but Json::Value lets you write and read the builder configuration, which is better! In other words, you can configure your JSON parser using JSON.
CharReaders and StreamWriters are not thread-safe, but they are re-usable.
std::unique_ptr<Json::CharReader>
const reader(rbuilder.
newCharReader());
reader->parse(start, stop, &value1, &errs);
reader->parse(start, stop, &value2, &errs);
CharReader * newCharReader() const override
Allocate a CharReader via operator new().
Json::Value settings_
Configuration of this builder.
See Json::CharReaderBuilder::settings_ and Json::StreamWriterBuilder::settings_ for the full list of settings.
Versioning
We make strong guarantees about binary-compatibility, consistent with the Apache versioning scheme.
- See also
- version.h
Related links