Skip to content
Jordan Bayles edited this page May 5, 2026 · 21 revisions

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 }
}

Features of jsoncpp

  • Read and write JSON document.
  • Attach C and C++ style comments to element during parsing.
  • Rewrite JSON document preserving original comments.

Code example

#include <json/json.h>
#include <iostream>

int main() {
    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";
    return 0;
}

You can also read from a file, e.g.:

#include <fstream>
#include <json/json.h>

int main() {
    Json::Value root;
    std::ifstream config_doc("config_doc.json", std::ifstream::binary);
    config_doc >> root;
    return 0;
}

If you need some unusual features, use Builders:

#include <fstream>
#include <iostream>
#include <json/json.h>

int main() {
    Json::Value root;
    Json::CharReaderBuilder rbuilder;
    std::ifstream config_doc("config_doc.json", std::ifstream::binary);
    
    // 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 1;
    }

    // ...

    Json::StreamWriterBuilder wbuilder;
    // Configure the Builder, then ...
    std::string outputConfig = Json::writeString(wbuilder, root);
    std::cout << outputConfig << std::endl;
    return 0;
}

A note on "comments"

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.

Build instructions

Current build instructions are located in the file README.md in the top-directory of the project.

For other build systems, see Building and Testing.

What's New?

See the release notes.

Older news can be found in Legacy News (Up to 1.4.0).

Related links

  • JSON Specification and alternate language implementations.
  • YAML A data format designed for human readability.
  • UTF-8 and Unicode FAQ.

License

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.

Clone this wiki locally