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.

Reply via email to