features.md 3.61 KB
Newer Older
Milo Yip's avatar
Milo Yip committed
1 2 3 4 5
# RapidJSON Features

## General

* Cross-platform
Milo Yip's avatar
Milo Yip committed
6 7 8
 * Compilers: Visual Studio, gcc, clang, etc.
 * Architectures: x86, x64, ARM, etc.
 * Operating systems: Windows, Mac OS X, Linux, iOS, Android, etc.
Milo Yip's avatar
Milo Yip committed
9 10
* Easy installation
 * Header files only library. Just copy the headers to your project.
Milo Yip's avatar
Milo Yip committed
11
* Self-contained, minimal dependences
Milo Yip's avatar
Milo Yip committed
12
 * No STL, BOOST, etc.
Milo Yip's avatar
Milo Yip committed
13
 * Only included `<cstdio>`, `<cstdlib>`, `<cstring>`, `<inttypes.h>`, `<new>`, `<stdint.h>`. 
Milo Yip's avatar
Milo Yip committed
14
* Without C++ exception, RTTI
Milo Yip's avatar
Milo Yip committed
15 16 17 18 19 20 21 22 23
* High performance
 * Use template and inline functions to reduce function call overheads.
 * Optional SSE2/SSE4.1 support.

## Standard compliance

* RapidJSON should be fully RFC4627/ECMA-404 compliance.
* Support unicode surrogate.
* Support null character (`"\u0000"`)
Milo Yip's avatar
Milo Yip committed
24
 * For example, `["Hello\u0000World"]` can be parsed and handled gracefully. There is API for getting/setting lengths of string.
Milo Yip's avatar
Milo Yip committed
25 26 27 28 29

## Unicode

* Support UTF-8, UTF-16, UTF-32 encodings, including little endian and big endian.
 * These encodings are used in input/output streams and in-memory representation.
Milo Yip's avatar
Milo Yip committed
30
* Support automatic detection of encodings in input stream.
Milo Yip's avatar
Milo Yip committed
31 32 33 34
* Support transcoding between encodings internally.
 * For example, you can read a UTF-8 file and let RapidJSON transcode the JSON strings into UTF-16 in the DOM.
* Support encoding validation internally.
 * For example, you can read a UTF-8 file, and let RapidJSON check whether all JSON strings are valid UTF-8 byte sequence.
Milo Yip's avatar
Milo Yip committed
35 36
* Support custom character types.
 * By default the character types are `char` for UTF8, `wchar_t` for UTF16, `uint32_t` for UTF32.
Milo Yip's avatar
Milo Yip committed
37 38
* Support custom encodings.

Milo Yip's avatar
Milo Yip committed
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
## API styles

* SAX (Simple API for XML) style API
 * Similar to [SAX](http://en.wikipedia.org/wiki/Simple_API_for_XML), RapidJSON provides a event sequential access parser API (`GenericReader`). It also provides a generator API (`GenericWriter`) which consumes the same set of events.
* DOM (Document Object Model) style API
 * Similar to [DOM](http://en.wikipedia.org/wiki/Document_Object_Model) for HTML/XML, RapidJSON can parse JSON into a DOM representation (`GenericDocument`), for easy manipulation, and finally stringify back to JSON if needed.
 * The DOM style API (`GenericDocument`) is actually implemented with SAX style API (`GenericReader`). SAX is faster but sometimes DOM is easier. Users can pick their choices according to scenarios.

## DOM (Document)

* Support insitu parsing.
 * Parse JSON string values in-place at the source JSON, and then the DOM points to addresses of those strings.
 * Faster than convention parsing: no allocation for strings, no copy (if string does not contain escapes), cache-friendly.
* Support 32-bit/64-bit signed/unsigned integer and `double` for JSON number type.
 * RapidJSON checks range of numerical values for conversions.

## SAX (Reader)

* Support comprehensive error code if parsing failed.
* Support localizable error message.

## SAX (Writer)

* Support PrettyWriter for adding newlines and indentations.
* Support custom precision for floating point values.

Milo Yip's avatar
Milo Yip committed
65 66 67 68 69 70 71 72 73 74 75 76 77
## Stream

* Support `GenericStringBuffer` for storing the output JSON as string.
* Support `FileReadStream`/`FileWriteStream` for input/output `FILE` object.
* Support custom streams.

## Memory

* Minimize memory overheads for DOM.
 * Each JSON value occupies exactly 16/20 bytes for most 32/64-bit machines (excluding text string).
* Support fast default allocator.
 * A stack-based allocator (allocate sequentially, prohibit to free individual allocations, suitable for parsing).
 * User can provide a pre-allocated buffer. (Possible to parse a number of JSONs without any CRT allocation)
Milo Yip's avatar
Milo Yip committed
78
* Support standard CRT(C-runtime) allocator.
Milo Yip's avatar
Milo Yip committed
79
* Support custom allocators.