From bc2daea2f67c024af1c5e4905e6dde80c4a8c856 Mon Sep 17 00:00:00 2001 From: Milo Yip Date: Wed, 2 Jul 2014 00:20:36 +0800 Subject: [PATCH] Add other query sections in tutorial --- doc/diagram/.gitignore | 1 + doc/diagram/makefile | 2 +- doc/diagram/tutorial.dot | 58 ++++++++++++++ doc/diagram/tutorial.png | Bin 0 -> 31206 bytes doc/tutorial.md | 161 +++++++++++++++++++++++++++++++++++---- 5 files changed, 208 insertions(+), 14 deletions(-) create mode 100644 doc/diagram/.gitignore create mode 100644 doc/diagram/tutorial.dot create mode 100644 doc/diagram/tutorial.png diff --git a/doc/diagram/.gitignore b/doc/diagram/.gitignore new file mode 100644 index 000000000..a13633799 --- /dev/null +++ b/doc/diagram/.gitignore @@ -0,0 +1 @@ +*.pdf diff --git a/doc/diagram/makefile b/doc/diagram/makefile index 46994386e..348397765 100644 --- a/doc/diagram/makefile +++ b/doc/diagram/makefile @@ -5,4 +5,4 @@ dot $< -Tpng -o $@ DOTFILES = $(basename $(wildcard *.dot)) -all: $(addsuffix .png, $(DOTFILES)) #$(addsuffix .pdf, $(DOTFILES)) +all: $(addsuffix .png, $(DOTFILES)) $(addsuffix .pdf, $(DOTFILES)) diff --git a/doc/diagram/tutorial.dot b/doc/diagram/tutorial.dot new file mode 100644 index 000000000..b4f5d5f49 --- /dev/null +++ b/doc/diagram/tutorial.dot @@ -0,0 +1,58 @@ +digraph { + compound=true + fontname="Inconsolata, Consolas" + fontsize=10 + margin="0,0" + ranksep=0.2 + penwidth=0.5 + + node [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] + edge [fontname="Inconsolata, Consolas", fontsize=10] + + subgraph cluster1 { + margin="10,10" + labeljust="left" + label = "Document" + style=filled + fillcolor=gray95 + node [shape=Mrecord, style=filled, colorscheme=spectral7] + + root [label="{object|}", fillcolor=3] + + { + hello [label="{string|\"hello\"}", fillcolor=5] + t [label="{string|\"t\"}", fillcolor=5] + f [label="{string|\"f\"}", fillcolor=5] + n [label="{string|\"n\"}", fillcolor=5] + i [label="{string|\"i\"}", fillcolor=5] + pi [label="{string|\"pi\"}", fillcolor=5] + a [label="{string|\"a\"}", fillcolor=5] + + world [label="{string|\"world\"}", fillcolor=5] + true [label="{true|}", fillcolor=7] + false [label="{false|}", fillcolor=2] + null [label="{null|}", fillcolor=1] + i1 [label="{number|123}", fillcolor=6] + pi1 [label="{number|3.1416}", fillcolor=6] + array [label="{array|size=4}", fillcolor=4] + + a1 [label="{number|1}", fillcolor=6] + a2 [label="{number|2}", fillcolor=6] + a3 [label="{number|3}", fillcolor=6] + a4 [label="{number|4}", fillcolor=6] + } + + edge [arrowhead=vee] + root -> { hello, t, f, n, i, pi, a } + array -> { a1, a2, a3, a4} + + edge [arrowhead=none] + hello -> world + t -> true + f -> false + n -> null + i -> i1 + pi -> pi1 + a -> array + } +} \ No newline at end of file diff --git a/doc/diagram/tutorial.png b/doc/diagram/tutorial.png new file mode 100644 index 0000000000000000000000000000000000000000..77c3a6d2c6b8a00b7e361adeae947d0c92659c3d GIT binary patch literal 31206 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 NH@WZT literal 0 HcmV?d00001 diff --git a/doc/tutorial.md b/doc/tutorial.md index 02d61cfdf..2af17585f 100644 --- a/doc/tutorial.md +++ b/doc/tutorial.md @@ -1,10 +1,10 @@ # RapidJSON Tutorial -This tutorial introduces Document Object Model(DOM) API of RapidJSON. +This tutorial introduces the basics of the Document Object Model(DOM) API. -As shown in [Usage at a glance](../readme.md#usage-at-a-glance), a JSON text can be parsed into DOM, and then be quried and modfied easily, and finally convert back to JSON text. +As shown in [Usage at a glance](../readme.md#usage-at-a-glance), a JSON text can be parsed into DOM, and then the DOM can be queried and modfied easily, and finally be converted back to JSON text. -## Value +## Value & Document Each JSON value is stored in a type called `Value`. A `Document`, representing the DOM, contains the root of `Value`. @@ -36,9 +36,11 @@ Document document; document.Parse(json); ``` -The JSON text is now parsed into `document` as a DOM tree. +The JSON text is now parsed into `document` as a DOM tree: -The root of a conforming JSON should be either an object or an array. In this case, the root is an object with 7 members. +![tutorial](diagram/tutorial.png?raw=true) + +The root of a conforming JSON should be either an object or an array. In this case, the root is an object. ```cpp assert(document.IsObject()); ``` @@ -50,17 +52,29 @@ assert(document["hello"].IsString()); printf("hello = %s\n", document["hello"].GetString()); ``` +``` +world +``` + JSON true/false values are represented as `bool`. ```cpp assert(document["t"].IsBool()); printf("t = %s\n", document["t"].GetBool() ? "true" : "false"); ``` +``` +true +``` + JSON null can be queryed by `IsNull()`. ```cpp printf("n = %s\n", document["n"].IsNull() ? "null" : "?"); ``` +``` +null +``` + JSON number type represents all numeric values. However, C++ needs more specific type for manipulation. ```cpp @@ -76,7 +90,12 @@ assert(document["pi"].IsDouble()); printf("pi = %g\n", document["pi"].GetDouble()); ``` -JSON array contains a number of elements +``` +i = 123 +pi = 3.1416 +``` + +JSON array contains a number of elements. ```cpp // Using a reference for consecutive access is handy and faster. const Value& a = document["a"]; @@ -85,16 +104,132 @@ for (SizeType i = 0; i < a.Size(); i++) // Uses SizeType instead of size_t printf("a[%d] = %d\n", i, a[i].GetInt()); ``` -Note that, RapidJSON do not automatically converting between JSON types. if a value is a string, it is invalid to call `GetInt()`. In debug mode it will assert. In release mode, the behavior is undefined. +``` +a[0] = 1 +a[1] = 2 +a[2] = 3 +a[3] = 4 +``` -## Create/Modify Values +Note that, RapidJSON does not automatically convert values between JSON types. If a value is a string, it is invalid to call `GetInt()`, for example. In debug mode it will fail an assertion. In release mode, the behavior is undefined. + +In the following, details about querying individual types are discussed. + +### Querying Array + +By default, `SizeType` is typedef of `unsigned`. In most systems, array is limited to store up to 2^32-1 elements. + +You may access the elements in array by integer literal, for example, `a[1]`, `a[2]`. However, `a[0]` will generate a compiler error. It is because two overloaded operators `operator[](SizeType)` and `operator[](const char*)` is avaliable, and C++ can treat `0` as a null pointer. Workarounds: +* `a[SizeType(0)]` +* `a[0u]` + +Array is similar to `std::vector`, instead of using indices, you may also use iterator to access all the elements. +```cpp +for (Value::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) + printf("%d ", itr->GetInt()); +``` + +And other familar query functions: +* `SizeType Capacity() const` +* `bool Empty() const` + +### Quering Object + +Similarly, we can iterate object members by iterator: + +```cpp +static const char* kTypeNames[] = + { "Null", "False", "True", "Object", "Array", "String", "Number" }; + +for (Value::ConstMemberIterator itr = document.MemberBegin(); + itr != document.MemberEnd(); ++itr) +{ + printf("Type of member %s is %s\n", + itr->name.GetString(), kTypeNames[itr->value.GetType()]); +} +``` -## Object +``` +Type of member hello is String +Type of member t is True +Type of member f is False +Type of member n is Null +Type of member i is Number +Type of member pi is Number +Type of member a is Array +``` + +Note that, when `operator[](const char*)` cannot find the member, it will fail an assertion. + +If we are unsure whether a member exists, we need to call `HasMember()` before calling `operator[](const char*)`. However, this incurs two lookup. A better way is to call `FindMember()`, which can check the existence of member and obtain its value at once: + +```cpp +Value::ConstMemberIerator itr = document.FindMember("hello"); +if (itr != 0) + printf("%s %s\n", itr->value.GetString()); +``` + +### Querying Number + +JSON provide a single numerical type called Number. Number can be integer or real numbers. RFC 4627 says the range of Number is specified by parser. + +As C++ provides several integer and floating point number types, the DOM trys to handle these with widest possible range and good performance. + +When the DOM parses a Number, it stores it as either one of the following type: + +Type | Description +--------------------------------------------------- +`unsigned` | 32-bit unsigned integer +`int` | 32-bit signed integer +`uint64_t` | 64-bit unsigned integer +`int64_t` | 64-bit signed integer +`double` | 64-bit double precision floating point + +When querying a number, you can check whether the number can be obtained as target type: + +Function | Description +----------------------------------------------- +`IsNumber()` | whether the value is a number +`IsInt()` | whether the number is a int +`IsUint()` | whether the number is a uint +`IsInt64()` | whether the number is a int64_t +`IsUint64()` | whether the number is a uint64_t +`IsDouble()` | whether the number is a double + +Note that, an integer value may be obtained in various ways without conversion. For example, A value `x` containing `123` will make `x.IsInt() == x.IsUint() == x.Int64() == x.Uint64() == ture`. But a value `y` containing `-3000000000` will only makes `x.int64() == true`. + +When obtaining the numeric values, `GetDouble()` will convert internal integer representation to a `double`. Note that, `int` and `uint` can be safely convert to `double`, but `int64_t` and `uint64_t` may lose precision (since mantissa of `double` is only 52-bits). + +### Querying String + +In addition to `GetString()`, the `Value` class also contains `GetStringLength()`. Here explains why. + +According to RFC 4627, JSON strings can contain unicode character `U+0000`, which must be escaped as `"\u0000"`. The problem is that, C/C++ often uses null-terminated string, which treats ``\0'` as the terminator symbol. + +To conform RFC 4627, RapidJSON supports string containing `U+0000`. If you need to handle this, you can use `GetStringLength()` API to obtain the correct length of string. + +For example, after parsing a the following JSON string to `Document d`. + +```js +{ "s" : "a\u0000b" } +``` +The correct length of the value `"a\u0000b"` is 3. But `strlen()` returns 1. + +`GetStringLength()` can also improve performance, as user may often need to call `strlen()` for allocating buffer. + +Besides, `std::string` also support a constructor: + +```cpp +string( const char* s, size_type count); +``` + +which accepts the length of string as parameter. This constructor supports storing null character within the string, and should also provide better performance. + +## Create/Modify Values -## Array +### Object -## String +### Array -## Number +### String -## True/False/Null