package com.alibaba.fastjson; import java.io.IOException; import java.io.Writer; import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fastjson.serializer.SerializeWriter; public class JSONWriter { private SerializeWriter writer; private final Writer out; private JSONSerializer serializer; private Context context; public static enum State { BeginObject, // PropertyKey, // PropertyValue, // BeginArray, // ArrayValue } public static class Context { private final Context parent; private State state; public Context(Context parent, State state) { this.parent = parent; this.state = state; } public Context getParent() { return parent; } public State getState() { return state; } public void setState(State state) { this.state = state; } } public JSONWriter(Writer out) { this.out = out; writer = new SerializeWriter(); serializer = new JSONSerializer(writer); } public void flush() throws IOException { writer.writeTo(out); writer = new SerializeWriter(); serializer = new JSONSerializer(writer); } public void close() throws IOException { if (writer.size() != 0) { flush(); } } public void writeStartObject() { if (context == null) { context = new Context(null, State.BeginObject); } else { if (context.getState() == State.PropertyKey) { writer.write(':'); } else if (context.getState() == State.ArrayValue) { writer.write(','); } else if (context.getState() == State.BeginObject) { // skip } else if (context.getState() == State.BeginArray) { // skip } else { throw new JSONException("illegal state : " + context.getState()); } context = new Context(context, State.BeginObject); } writer.write('{'); } public void writeEndObject() { writer.write('}'); context = context.getParent(); if (context == null) { // skip } else if (context.getState() == State.PropertyKey) { context.setState(State.PropertyValue); } else if (context.getState() == State.BeginArray) { context.setState(State.ArrayValue); } else if (context.getState() == State.ArrayValue) { // skip } } public void writeKey(String key) { if (context.getState() == State.PropertyValue) { writer.write(','); } writer.writeString(key); context.setState(State.PropertyKey); } public void writeValue(Object object) { if (context.getState() == State.PropertyKey) { writer.write(':'); } serializer.write(object); context.setState(State.PropertyValue); } public void writeStartArray() { if (context == null) { context = new Context(null, State.BeginArray); } else { if (context.getState() == State.PropertyKey) { writer.write(':'); } else if (context.getState() == State.ArrayValue) { writer.write(','); } else if (context.getState() == State.BeginArray) { // skipe } else { throw new JSONException("illegal state : " + context.getState()); } context = new Context(context, State.BeginArray); } writer.write('['); } public void writeEndArray() { writer.write(']'); context = context.getParent(); if (context == null) { // skip } else if (context.getState() == State.PropertyKey) { context.setState(State.PropertyValue); } else if (context.getState() == State.BeginArray) { context.setState(State.ArrayValue); } else if (context.getState() == State.ArrayValue) { // skip } } }