Json Reader
Reads a JSON (RFC 7159) encoded value as a stream of tokens. This stream includes both literal values (strings, numbers, booleans, and nulls) as well as the begin and end delimiters of objects and arrays. The tokens are traversed in depth-first order, the same order that they appear in the JSON document. Within JSON objects, name/value pairs are represented by a single token.
Parsing JSONTo create a recursive descent parser for your own JSON streams, first create an entry point method that creates a{@code JsonReader}
. Next, create handler methods for each structure in your JSON text. You'll need a method for each object type and for each array type.
- Within array handling methods, first call beginArray to consume the array's opening bracket. Then create a while loop that accumulates values, terminating when hasNext is false. Finally, read the array's closing bracket by calling .
- Within object handling methods, first call beginObject to consume the object's opening brace. Then create a while loop that assigns values to local variables based on their name. This loop should terminate when hasNext is false. Finally, read the object's closing brace by calling endObject.
When a nested object or array is encountered, delegate to the corresponding handler method.
When an unknown name is encountered, strict parsers should fail with an exception. Lenient parsers should call skipValue to recursively skip the value's nested tokens, which may otherwise conflict.
If a value may be null, you should first check using peek. Null literals can be consumed using either nextNull or skipValue.
ExampleSuppose we'd like to parse a stream of messages such as the following:{@code * [ * { * "id": 912345678901, * "text": "How do I read a JSON stream in Java?", * "geo": null, * "user": { * "name": "json_newb", * "followers_count": 41 * } * }, * { * "id": 912345678902, * "text": "@json_newb just use JsonReader!", * "geo": [50.454722, -104.606667], * "user": { * "name": "jesse", * "followers_count": 2 * } * } * ] * }
{@code * public ListreadJsonStream(BufferedSource source) throws IOException {
* JsonReader reader = JsonReader.of(source);
* try {
* return readMessagesArray(reader);
* } finally {
* reader.close();
* }
* }
*
* public List
{@code [1, "1"]}
may be read using either or nextString. This behavior is intended to prevent lossy numeric conversions: double is JavaScript's only numeric type and very large values like {@code 9007199254740993}
cannot be represented exactly on that platform. To minimize precision loss, extremely large values should be written and read as strings in JSON. Each {@code JsonReader}
may be used to read a single JSON stream. Instances of this class are not thread safe.