etf.org/rfc/rfc4627.txt">RFC 4627) encoded value to a stream, one token at a time. The stream includes both literal values (strings, numbers, booleans and nulls) as well as the begin and end delimiters of objects and arrays.
Encoding JSON
To encode your data as JSON, create a new {@code JsonWriter}. Each JSON document must contain one top-level array or object. Call methods on the writer as you walk the structure's contents, nesting arrays and objects as necessary:
- To write arrays, first call {@link #beginArray()}. Write each of the array's elements with the appropriate {@link #value}methods or by nesting other arrays and objects. Finally close the array using {@link #endArray()}.
- To write objects, first call {@link #beginObject()}. Write each of the object's properties by alternating calls to {@link #name} with the property's value. Write property values with theappropriate {@link #value} method or by nesting other objects or arrays.Finally close the object using {@link #endObject()}.
Example
Suppose we'd like to encode a stream of messages such as the following:
{@code [}{ "id": 912345678901, "text": "How do I stream JSON in Java?", "geo": null, "user": { "name": "json_newb", "followers_count": 41 } }, { "id": 912345678902, "text": "@json_newb just use JsonWriter!", "geo": [50.454722, -104.606667], "user": { "name": "jesse", "followers_count": 2 } } ]}
This code encodes the above structure:
{@code}public void writeJsonStream(OutputStream out, List messages) throws IOException JsonWriter writer = new JsonWriter(new OutputStreamWriter(out, "UTF-8")); writer.setIndentSpaces(4); writeMessagesArray(writer, messages); writer.close(); } public void writeMessagesArray(JsonWriter writer, List messages) throws IOException { writer.beginArray(); for (Message message : messages) { writeMessage(writer, message); } writer.endArray(); } public void writeMessage(JsonWriter writer, Message message) throws IOException { writer.beginObject(); writer.name("id").value(message.getId()); writer.name("text").value(message.getText()); if (message.getGeo() != null) { writer.name("geo"); writeDoublesArray(writer, message.getGeo()); } else { writer.name("geo").nullValue(); } writer.name("user"); writeUser(writer, message.getUser()); writer.endObject(); } public void writeUser(JsonWriter writer, User user) throws IOException { writer.beginObject(); writer.name("name").value(user.getName()); writer.name("followers_count").value(user.getFollowersCount()); writer.endObject(); } public void writeDoublesArray(JsonWriter writer, List doubles) throws IOException { writer.beginArray(); for (Double value : doubles) { writer.value(value); } writer.endArray(); }}
Each {@code JsonWriter} may be used to write a single JSON stream.Instances of this class are not thread safe. Calls that would result in a malformed JSON string will fail with an {@link IllegalStateException}.
@author Jesse Wilson
@since 1.6