21 Home
Jordan Bayles edited this page 2026-05-05 15:50:51 -07:00

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).

  • 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.