/**
\mainpage
\section _intro Introduction

<a HREF="http://www.json.org/">JSON (JavaScript Object Notation)</a>
 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:
\verbatim
// Configuration options
{
    // Default encoding for text
    "encoding" : "UTF-8",
    
    // Plug-ins loaded at start-up
    "plug-ins" : [
        "python",
        "c++",
        "ruby"
        ],
        
    // Tab indent size
    "indent" : { "length" : 3, "use_space": true }
}
\endverbatim

\section _features Features
- read and write JSON document
- attach C and C++ style comments to element during parsing
- rewrite JSON document preserving original comments

Notes: 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 was
preserved.

\section _example Code example

\code
Json::Value root;   // will contains the root value after parsing.
Json::Reader reader;
bool parsingSuccessful = reader.parse( config_doc, root );
if ( !parsingSuccessful )
{
    // report to the user the failure and their locations in the document.
    std::cout  << "Failed to parse configuration\n"
               << reader.getFormattedErrorMessages();
    return;
}

// Get the value of the member of root named 'encoding', return 'UTF-8' if there is no
// such member.
std::string encoding = root.get("encoding", "UTF-8" ).asString();
// Get the value of the member of root named 'encoding', return a 'null' value if
// there is no such member.
const Json::Value plugins = root["plug-ins"];
for ( int index = 0; index < plugins.size(); ++index )  // Iterates over the sequence elements.
   loadPlugIn( plugins[index].asString() );
   
setIndentLength( root["indent"].get("length", 3).asInt() );
setIndentUseSpace( root["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"] = getCurrentEncoding();
root["indent"]["length"] = getCurrentIndentLength();
root["indent"]["use_space"] = getCurrentIndentUseSpace();

Json::StyledWriter writer;
// Make a new JSON document for the configuration. Preserve original comments.
std::string outputConfig = writer.write( root );

// You can also use streams.  This will put the contents of any JSON
// stream at a particular sub-value, if you'd like.
std::cin >> root["subtree"];

// And you can write to a stream, using the StyledWriter automatically.
std::cout << root;
\endcode

\section _pbuild Build instructions
The build instructions are located in the file 
<a HREF="README.txt">README.txt</a> in the top-directory of the project.

Permanent link to the latest revision of the file in subversion: 
<a HREF="http://jsoncpp.svn.sourceforge.net/viewvc/jsoncpp/trunk/jsoncpp/README.txt?view=markup">latest README.txt</a>

\section _pdownload Download
The sources can be downloaded from 
<a HREF="http://sourceforge.net/projects/jsoncpp/files/">SourceForge download page</a>.

The latest version of the source is available in the project's subversion repository: 
<a HREF="http://jsoncpp.svn.sourceforge.net/svnroot/jsoncpp/trunk/">
http://jsoncpp.svn.sourceforge.net/svnroot/jsoncpp/trunk/</a>

To checkout the source, see the following 
<a HREF="http://sourceforge.net/scm/?type=svn&group_id=144446">instructions</a>.

\section _news What's New?
The description of latest changes can be found in 
<a HREF="NEWS.txt">NEWS.txt</a> in the top-directory of the project.

Permanent link to the latest revision of the file in subversion: 
<a HREF="http://svn.sourceforge.net/viewcvs.cgi/jsoncpp/README.txt?view=markup">latest NEWS.txt</a>

\section _plinks Project links
- <a HREF="http://jsoncpp.sourceforge.net">json-cpp home</a>
- <a HREF="http://www.sourceforge.net/projects/jsoncpp/">json-cpp sourceforge project</a>

\section _rlinks Related links
- <a HREF="http://www.json.org/">JSON</a> Specification and alternate language implementations.
- <a HREF="http://www.yaml.org/">YAML</a> A data format designed for human readability.
- <a HREF="http://www.cl.cam.ac.uk/~mgk25/unicode.html">UTF-8 and Unicode FAQ</a>.

\section _license License
See file <a HREF="LICENSE">LICENSE</a> in the top-directory of the project.

Basically JsonCpp is licensed under MIT license, or public domain if desired 
and recognized in your jurisdiction.

\author Baptiste Lepilleur <blep@users.sourceforge.net>
*/
