You may be looking for `JsonGenerator.copyCurrentEvent(parser)` (or `copyCurrentStructure(parser)`) method....
-+ Tatu +- On Sun, Nov 11, 2018 at 7:51 PM Niels Bertram <[email protected]> wrote: > > I am trying to stream JSON data read by a JsonParser to a JsonGenerator. Has > anyone ever come across an example that chains the 2 together? The only next > best thing I could come up with is write a "transform" method that would read > from parser and then write it to generator. It looks so terrifyingly generic, > surely this is not the first time someone would have to do this king of thing. > > Any pointers would be greatly appreciated. > > Cheers, Niels > > > > import org.junit.Test; > > import java.io.IOException; > import java.io.InputStream; > import java.io.StringWriter; > > import com.fasterxml.jackson.core.*; > > public class JsonStreamingTest { > > @Test > public void streamJson() throws Exception { > > String input = > convertStreamToString(getClass().getClassLoader().getResourceAsStream("files/simple.json")); > > StringWriter result = new StringWriter(); > > JsonFactory factory = new JsonFactory(); > JsonParser reader = factory.createParser(input); > JsonGenerator writer = > factory.createGenerator(result).useDefaultPrettyPrinter(); > > transform(reader, writer, 1); > > writer.close(); > reader.close(); > > System.out.println(result.toString()); > > } > > private void transform(JsonParser parser, JsonGenerator generator, int > level) throws IOException { > > while (parser.nextToken() != null) { > > JsonToken token = parser.currentToken(); > > switch (token) { > case START_OBJECT: > generator.writeStartObject(); > read(parser, generator, level + 1); > break; > case END_OBJECT: > generator.writeEndObject(); > break; > case START_ARRAY: > generator.writeStartArray(); > read(parser, generator, level + 1); > case END_ARRAY: > generator.writeEndArray(); > break; > case FIELD_NAME: > String name = parser.currentName(); > JsonToken value = parser.nextValue(); > switch (value) { > case VALUE_NULL: > generator.writeNullField(name); > break; > case VALUE_TRUE: > case VALUE_FALSE: > generator.writeBooleanField(name, parser.getBooleanValue()); > break; > case VALUE_STRING: > generator.writeStringField(name, parser.getValueAsString()); > break; > case VALUE_NUMBER_INT: > generator.writeNumberField(name, parser.getValueAsInt()); > break; > case VALUE_NUMBER_FLOAT: > generator.writeNumberField(name, parser.getFloatValue()); > break; > case START_ARRAY: > generator.writeArrayFieldStart(name); > read(parser, generator, level + 1); > break; > case END_ARRAY: > generator.writeEndArray(); > case START_OBJECT: > generator.writeObjectFieldStart(name); > read(parser, generator, level + 1); > break; > case END_OBJECT: > generator.writeEndObject(); > break; > default: > throw new RuntimeException("cannot process this type " + > token.toString()); } > break; > case VALUE_STRING: > generator.writeString(parser.getValueAsString()); > break; > default: > throw new RuntimeException("cannot process this type " + > token.toString()); > } > } > > } > > private static String convertStreamToString(InputStream stream) { > java.util.Scanner s = new java.util.Scanner(stream).useDelimiter("\\A"); > return s.hasNext() ? s.next() : ""; > } > > } > > > -- > You received this message because you are subscribed to the Google Groups > "jackson-user" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "jackson-user" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. For more options, visit https://groups.google.com/d/optout.
