package com.koushikdutta.ion.gson; import com.google.gson.JsonElement; import com.google.gson.JsonParseException; import com.google.gson.JsonParser; import com.google.gson.stream.JsonReader; import com.koushikdutta.async.ByteBufferList; import com.koushikdutta.async.DataEmitter; import com.koushikdutta.async.DataSink; import com.koushikdutta.async.callback.CompletedCallback; import com.koushikdutta.async.future.Future; import com.koushikdutta.async.future.TransformFuture; import com.koushikdutta.async.parser.AsyncParser; import com.koushikdutta.async.parser.ByteBufferListParser; import com.koushikdutta.async.parser.StringParser; import com.koushikdutta.async.stream.ByteBufferListInputStream; import java.io.InputStreamReader; /** * Created by koush on 5/27/13. */ public class GsonParser<T extends JsonElement> implements AsyncParser<T> { public GsonParser() { } @Override public Future<T> parse(DataEmitter emitter) { return new ByteBufferListParser().parse(emitter) .then(new TransformFuture<T, ByteBufferList>() { @Override protected void transform(ByteBufferList result) throws Exception { JsonParser parser = new JsonParser(); T parsed = (T)parser.parse(new JsonReader(new InputStreamReader(new ByteBufferListInputStream(result)))); if (parsed.isJsonNull() || parsed.isJsonPrimitive()) throw new JsonParseException("unable to parse json"); setComplete(null, parsed); } }); } @Override public void write(DataSink sink, T value, CompletedCallback completed) { new StringParser().write(sink, value.toString(), completed); } }