public abstract class JsonReader
extends java.lang.Object
implements java.io.Closeable
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.
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 endArray().
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().
[
{
"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
}
}
]
This code implements the parser for the above structure:
public List<Message> readJsonStream(BufferedSource source) throws IOException {
JsonReader reader = JsonReader.of(source);
try {
return readMessagesArray(reader);
} finally {
reader.close();
}
}
public List<Message> readMessagesArray(JsonReader reader) throws IOException {
List<Message> messages = new ArrayList<Message>();
reader.beginArray();
while (reader.hasNext()) {
messages.add(readMessage(reader));
}
reader.endArray();
return messages;
}
public Message readMessage(JsonReader reader) throws IOException {
long id = -1;
String text = null;
User user = null;
List<Double> geo = null;
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("id")) {
id = reader.nextLong();
} else if (name.equals("text")) {
text = reader.nextString();
} else if (name.equals("geo") && reader.peek() != Token.NULL) {
geo = readDoublesArray(reader);
} else if (name.equals("user")) {
user = readUser(reader);
} else {
reader.skipValue();
}
}
reader.endObject();
return new Message(id, text, user, geo);
}
public List<Double> readDoublesArray(JsonReader reader) throws IOException {
List<Double> doubles = new ArrayList<Double>();
reader.beginArray();
while (reader.hasNext()) {
doubles.add(reader.nextDouble());
}
reader.endArray();
return doubles;
}
public User readUser(JsonReader reader) throws IOException {
String username = null;
int followersCount = -1;
reader.beginObject();
while (reader.hasNext()) {
String name = reader.nextName();
if (name.equals("name")) {
username = reader.nextString();
} else if (name.equals("followers_count")) {
followersCount = reader.nextInt();
} else {
reader.skipValue();
}
}
reader.endObject();
return new User(username, followersCount);
}
[1, "1"] may be read using either nextInt() or nextString().
This behavior is intended to prevent lossy numeric conversions: double is
JavaScript's only numeric type and very large values like 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 JsonReader may be used to read a single JSON stream. Instances
of this class are not thread safe.
| Modifier and Type | Class and Description |
|---|---|
static class |
JsonReader.Options
A set of strings to be chosen with
selectName(com.airbnb.lottie.parser.moshi.JsonReader.Options) or #selectString. |
static class |
JsonReader.Token
A structure, name, or value type in a JSON-encoded string.
|
| Modifier and Type | Method and Description |
|---|---|
abstract void |
beginArray()
Consumes the next token from the JSON stream and asserts that it is the beginning of a new
array.
|
abstract void |
beginObject()
Consumes the next token from the JSON stream and asserts that it is the beginning of a new
object.
|
abstract void |
endArray()
Consumes the next token from the JSON stream and asserts that it is the
end of the current array.
|
abstract void |
endObject()
Consumes the next token from the JSON stream and asserts that it is the end of the current
object.
|
java.lang.String |
getPath()
Returns a JsonPath to
the current location in the JSON value.
|
abstract boolean |
hasNext()
Returns true if the current array or object has another element.
|
abstract boolean |
nextBoolean()
Returns the boolean value of the next token, consuming it.
|
abstract double |
nextDouble()
Returns the double value of the next token, consuming it.
|
abstract int |
nextInt()
Returns the int value of the next token, consuming it.
|
abstract java.lang.String |
nextName()
Returns the next token, a property name, and consumes it.
|
abstract java.lang.String |
nextString()
Returns the string value of the next token, consuming it.
|
static JsonReader |
of(BufferedSource source)
Returns a new instance that reads UTF-8 encoded JSON from
source. |
abstract JsonReader.Token |
peek()
Returns the type of the next token without consuming it.
|
abstract int |
selectName(JsonReader.Options options)
If the next token is a property name that's in
options, this
consumes it and returns its index. |
abstract void |
skipName()
Skips the next token, consuming it.
|
abstract void |
skipValue()
Skips the next value recursively.
|
public static JsonReader of(BufferedSource source)
source.public abstract void beginArray()
throws java.io.IOException
java.io.IOExceptionpublic abstract void endArray()
throws java.io.IOException
java.io.IOExceptionpublic abstract void beginObject()
throws java.io.IOException
java.io.IOExceptionpublic abstract void endObject()
throws java.io.IOException
java.io.IOExceptionpublic abstract boolean hasNext()
throws java.io.IOException
java.io.IOExceptionpublic abstract JsonReader.Token peek() throws java.io.IOException
java.io.IOExceptionpublic abstract java.lang.String nextName()
throws java.io.IOException
JsonDataException - if the next token in the stream is not a property name.java.io.IOExceptionpublic abstract int selectName(JsonReader.Options options) throws java.io.IOException
options, this
consumes it and returns its index. Otherwise this returns -1 and no name is consumed.java.io.IOExceptionpublic abstract void skipName()
throws java.io.IOException
This throws a JsonDataException if this parser has been configured to fail on unknown names.
java.io.IOExceptionpublic abstract java.lang.String nextString()
throws java.io.IOException
JsonDataException - if the next token is not a string or if this reader is closed.java.io.IOExceptionpublic abstract boolean nextBoolean()
throws java.io.IOException
JsonDataException - if the next token is not a boolean or if this reader is closed.java.io.IOExceptionpublic abstract double nextDouble()
throws java.io.IOException
Double.parseDouble(String).JsonDataException - if the next token is not a literal value, or if the next literal
value cannot be parsed as a double, or is non-finite.java.io.IOExceptionpublic abstract int nextInt()
throws java.io.IOException
int, this method throws.JsonDataException - if the next token is not a literal value, if the next literal value
cannot be parsed as a number, or exactly represented as an int.java.io.IOExceptionpublic abstract void skipValue()
throws java.io.IOException
This throws a JsonDataException if this parser has been configured to fail on unknown values.
java.io.IOExceptionpublic final java.lang.String getPath()