215 lines
8.1 KiB
Markdown
215 lines
8.1 KiB
Markdown
|
Introduction
|
||
|
------------
|
||
|
|
||
|
[JSON][json-org] is a lightweight data-interchange format. It can represent
|
||
|
numbers, strings, ordered sequences of values, and collections of name/value
|
||
|
pairs.
|
||
|
|
||
|
[json-org]: http://json.org/
|
||
|
|
||
|
[JsonCpp][] is a C++ library that allows manipulating JSON values, including
|
||
|
serialization and deserialization to and from strings. It can also preserve
|
||
|
existing comment in unserialization/serialization steps, making it a convenient
|
||
|
format to store user input files.
|
||
|
|
||
|
[JsonCpp]: http://open-source-parsers.github.io/jsoncpp-docs/doxygen/index.html
|
||
|
|
||
|
## A note on backward-compatibility
|
||
|
* `1.y.z` is built with C++11.
|
||
|
* `0.y.z` can be used with older compilers.
|
||
|
* Major versions maintain binary-compatibility.
|
||
|
|
||
|
# Using JsonCpp in your project
|
||
|
-----------------------------
|
||
|
The recommended approach to integrating JsonCpp in your project is to include
|
||
|
the [amalgamated source](#generating-amalgamated-source-and-header) (a single
|
||
|
`.cpp` file and two `.h` files) in your project, and compile and build as you
|
||
|
would any other source file. This ensures consistency of compilation flags and
|
||
|
ABI compatibility, issues which arise when building shared or static
|
||
|
libraries. See the next section for instructions.
|
||
|
|
||
|
The `include/` should be added to your compiler include path. Jsoncpp headers
|
||
|
should be included as follow:
|
||
|
|
||
|
#include <json/json.h>
|
||
|
|
||
|
If JsonCpp was built as a dynamic library on Windows, then your project needs to
|
||
|
define the macro `JSON_DLL`.
|
||
|
|
||
|
Generating amalgamated source and header
|
||
|
----------------------------------------
|
||
|
JsonCpp is provided with a script to generate a single header and a single
|
||
|
source file to ease inclusion into an existing project. The amalgamated source
|
||
|
can be generated at any time by running the following command from the
|
||
|
top-directory (this requires Python 2.6):
|
||
|
|
||
|
python amalgamate.py
|
||
|
|
||
|
It is possible to specify header name. See the `-h` option for detail.
|
||
|
|
||
|
By default, the following files are generated:
|
||
|
* `dist/jsoncpp.cpp`: source file that needs to be added to your project.
|
||
|
* `dist/json/json.h`: corresponding header file for use in your project. It is
|
||
|
equivalent to including `json/json.h` in non-amalgamated source. This header
|
||
|
only depends on standard headers.
|
||
|
* `dist/json/json-forwards.h`: header that provides forward declaration of all
|
||
|
JsonCpp types.
|
||
|
|
||
|
The amalgamated sources are generated by concatenating JsonCpp source in the
|
||
|
correct order and defining the macro `JSON_IS_AMALGAMATION` to prevent inclusion
|
||
|
of other headers.
|
||
|
|
||
|
# Contributing to JsonCpp
|
||
|
|
||
|
Building and testing with CMake
|
||
|
-------------------------------
|
||
|
[CMake][] is a C++ Makefiles/Solution generator. It is usually available on most
|
||
|
Linux system as package. On Ubuntu:
|
||
|
|
||
|
sudo apt-get install cmake
|
||
|
|
||
|
[CMake]: http://www.cmake.org
|
||
|
|
||
|
Note that Python is also required to run the JSON reader/writer tests. If
|
||
|
missing, the build will skip running those tests.
|
||
|
|
||
|
When running CMake, a few parameters are required:
|
||
|
|
||
|
* a build directory where the makefiles/solution are generated. It is also used
|
||
|
to store objects, libraries and executables files.
|
||
|
* the generator to use: makefiles or Visual Studio solution? What version or
|
||
|
Visual Studio, 32 or 64 bits solution?
|
||
|
|
||
|
Steps for generating solution/makefiles using `cmake-gui`:
|
||
|
|
||
|
* Make "source code" point to the source directory.
|
||
|
* Make "where to build the binary" point to the directory to use for the build.
|
||
|
* Click on the "Grouped" check box.
|
||
|
* Review JsonCpp build options (tick `BUILD_SHARED_LIBS` to build as a
|
||
|
dynamic library).
|
||
|
* Click the configure button at the bottom, then the generate button.
|
||
|
* The generated solution/makefiles can be found in the binary directory.
|
||
|
|
||
|
Alternatively, from the command-line on Unix in the source directory:
|
||
|
|
||
|
mkdir -p build/debug
|
||
|
cd build/debug
|
||
|
cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" ../..
|
||
|
make
|
||
|
|
||
|
Running `cmake -h` will display the list of available generators (passed using
|
||
|
the `-G` option).
|
||
|
|
||
|
By default CMake hides compilation commands. This can be modified by specifying
|
||
|
`-DCMAKE_VERBOSE_MAKEFILE=true` when generating makefiles.
|
||
|
|
||
|
Building and testing with SCons
|
||
|
-------------------------------
|
||
|
**Note:** The SCons-based build system is deprecated. Please use CMake; see the
|
||
|
section above.
|
||
|
|
||
|
JsonCpp can use [Scons][] as a build system. Note that SCons requires Python to
|
||
|
be installed.
|
||
|
|
||
|
[SCons]: http://www.scons.org/
|
||
|
|
||
|
Invoke SCons as follows:
|
||
|
|
||
|
scons platform=$PLATFORM [TARGET]
|
||
|
|
||
|
where `$PLATFORM` may be one of:
|
||
|
|
||
|
* `suncc`: Sun C++ (Solaris)
|
||
|
* `vacpp`: Visual Age C++ (AIX)
|
||
|
* `mingw`
|
||
|
* `msvc6`: Microsoft Visual Studio 6 service pack 5-6
|
||
|
* `msvc70`: Microsoft Visual Studio 2002
|
||
|
* `msvc71`: Microsoft Visual Studio 2003
|
||
|
* `msvc80`: Microsoft Visual Studio 2005
|
||
|
* `msvc90`: Microsoft Visual Studio 2008
|
||
|
* `linux-gcc`: Gnu C++ (linux, also reported to work for Mac OS X)
|
||
|
|
||
|
If you are building with Microsoft Visual Studio 2008, you need to set up the
|
||
|
environment by running `vcvars32.bat` (e.g. MSVC 2008 command prompt) before
|
||
|
running SCons.
|
||
|
|
||
|
## Running the tests manually
|
||
|
You need to run tests manually only if you are troubleshooting an issue.
|
||
|
|
||
|
In the instructions below, replace `path/to/jsontest` with the path of the
|
||
|
`jsontest` executable that was compiled on your platform.
|
||
|
|
||
|
cd test
|
||
|
# This will run the Reader/Writer tests
|
||
|
python runjsontests.py path/to/jsontest
|
||
|
|
||
|
# This will run the Reader/Writer tests, using JSONChecker test suite
|
||
|
# (http://www.json.org/JSON_checker/).
|
||
|
# Notes: not all tests pass: JsonCpp is too lenient (for example,
|
||
|
# it allows an integer to start with '0'). The goal is to improve
|
||
|
# strict mode parsing to get all tests to pass.
|
||
|
python runjsontests.py --with-json-checker path/to/jsontest
|
||
|
|
||
|
# This will run the unit tests (mostly Value)
|
||
|
python rununittests.py path/to/test_lib_json
|
||
|
|
||
|
# You can run the tests using valgrind:
|
||
|
python rununittests.py --valgrind path/to/test_lib_json
|
||
|
|
||
|
## Running the tests using scons
|
||
|
Note that tests can be run using SCons using the `check` target:
|
||
|
|
||
|
scons platform=$PLATFORM check
|
||
|
|
||
|
Building the documentation
|
||
|
--------------------------
|
||
|
Run the Python script `doxybuild.py` from the top directory:
|
||
|
|
||
|
python doxybuild.py --doxygen=$(which doxygen) --open --with-dot
|
||
|
|
||
|
See `doxybuild.py --help` for options.
|
||
|
|
||
|
Adding a reader/writer test
|
||
|
---------------------------
|
||
|
To add a test, you need to create two files in test/data:
|
||
|
|
||
|
* a `TESTNAME.json` file, that contains the input document in JSON format.
|
||
|
* a `TESTNAME.expected` file, that contains a flatened representation of the
|
||
|
input document.
|
||
|
|
||
|
The `TESTNAME.expected` file format is as follows:
|
||
|
|
||
|
* each line represents a JSON element of the element tree represented by the
|
||
|
input document.
|
||
|
* each line has two parts: the path to access the element separated from the
|
||
|
element value by `=`. Array and object values are always empty (i.e.
|
||
|
represented by either `[]` or `{}`).
|
||
|
* element path: `.` represents the root element, and is used to separate object
|
||
|
members. `[N]` is used to specify the value of an array element at index `N`.
|
||
|
|
||
|
See the examples `test_complex_01.json` and `test_complex_01.expected` to better
|
||
|
understand element paths.
|
||
|
|
||
|
Understanding reader/writer test output
|
||
|
---------------------------------------
|
||
|
When a test is run, output files are generated beside the input test files.
|
||
|
Below is a short description of the content of each file:
|
||
|
|
||
|
* `test_complex_01.json`: input JSON document.
|
||
|
* `test_complex_01.expected`: flattened JSON element tree used to check if
|
||
|
parsing was corrected.
|
||
|
* `test_complex_01.actual`: flattened JSON element tree produced by `jsontest`
|
||
|
from reading `test_complex_01.json`.
|
||
|
* `test_complex_01.rewrite`: JSON document written by `jsontest` using the
|
||
|
`Json::Value` parsed from `test_complex_01.json` and serialized using
|
||
|
`Json::StyledWritter`.
|
||
|
* `test_complex_01.actual-rewrite`: flattened JSON element tree produced by
|
||
|
`jsontest` from reading `test_complex_01.rewrite`.
|
||
|
* `test_complex_01.process-output`: `jsontest` output, typically useful for
|
||
|
understanding parsing errors.
|
||
|
|
||
|
License
|
||
|
-------
|
||
|
See the `LICENSE` file for details. In summary, JsonCpp is licensed under the
|
||
|
MIT license, or public domain if desired and recognized in your jurisdiction.
|