Skip to content

Instantly share code, notes, and snippets.

@kamikat
Last active January 15, 2019 10:32
Show Gist options
  • Select an option

  • Save kamikat/41666ade58b7e5d2f38f30dda9cccd0d to your computer and use it in GitHub Desktop.

Select an option

Save kamikat/41666ade58b7e5d2f38f30dda9cccd0d to your computer and use it in GitHub Desktop.
Clone a com.squareup.moshi.JsonReader object
import com.squareup.moshi.JsonReader;
import com.squareup.moshi.JsonWriter;
import okio.Buffer;
import okio.BufferedSink;
import java.io.IOException;
public final class MoshiHelper {
public static void dump(JsonReader reader, BufferedSink sink) throws IOException {
JsonWriter writer = JsonWriter.of(sink);
int nested = 0;
while (reader.peek() != JsonReader.Token.END_DOCUMENT) {
switch (reader.peek()) {
case BEGIN_ARRAY:
nested++;
reader.beginArray();
writer.beginArray();
break;
case END_ARRAY:
reader.endArray();
writer.endArray();
if (0 == --nested) return;
break;
case BEGIN_OBJECT:
nested++;
reader.beginObject();
writer.beginObject();
break;
case END_OBJECT:
reader.endObject();
writer.endObject();
if (0 == --nested) return;
break;
case NAME:
writer.name(reader.nextName());
break;
case NUMBER:
try {
writer.value(reader.nextLong());
} catch (Exception ignored) {
writer.value(reader.nextDouble());
}
break;
case BOOLEAN:
writer.value(reader.nextBoolean());
break;
case STRING:
writer.value(reader.nextString());
break;
case NULL:
reader.nextNull();
writer.nullValue();
break;
}
}
}
public static JsonReader copyOf(Buffer buffer) {
Buffer forked = new Buffer();
buffer.copyTo(forked, 0, buffer.size());
return JsonReader.of(forked);
}
}
@kamikat
Copy link
Author

kamikat commented Aug 12, 2016

To clone a JsonReader:

  1. Dumps token stream from JsonReader into a JsonWriter that writes to a buffer
  2. Create a new JsonReader from the buffer.
Buffer buffer = new Buffer();
MoshiHelper.dump(reader, buffer);
JsonReader copiedReader = MoshiHelper.copyOf(buffer);

@amayatsky
Copy link

Thanks a lot for the effort!
Looks like they've added this feature with a peekJson():
square/moshi@69d4f40#diff-4ac32a78649ca5bdd8e0ba38b7006a1eR14

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment