avro-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Dean Ericson (JIRA)" <j...@apache.org>
Subject [jira] [Created] (AVRO-1687) Converting JSON to avro fails
Date Wed, 24 Jun 2015 11:18:05 GMT
Dean Ericson created AVRO-1687:

             Summary: Converting JSON to avro fails 
                 Key: AVRO-1687
                 URL: https://issues.apache.org/jira/browse/AVRO-1687
             Project: Avro
          Issue Type: Bug
          Components: java
    Affects Versions: 1.7.7, 1.7.6, 1.8.0
            Reporter: Dean Ericson

I am trying to validate a JSON string that is sent to me.  Unfortunately, I get a stacktrace
indicating that my schema and JSON are not compatable: {code}org.apache.avro.AvroTypeException:
Unknown union branch hour{code} This does not seem right to me since the JSON being passed
to me was created from the same schema I am using to validate it.

Here are my tests
	public static void testGenerateSchema() throws IOException {
		// get the reflected schema for packets
		File schemaFile = new File("avro.schema");
		schema = ReflectData.AllowNull.get().getSchema(Packet.class);
		try (DataFileWriter<Schema> schemaWiter = new DataFileWriter<>(
				new GenericDatumWriter<Schema>())) {
			schemaWiter.create(schema, schemaFile);

		assertTrue(schemaFile.length() > 0);

	public void testAvroJsonToBinarySerialization() throws Exception {

		String json = "{\"cost\": 0, \"stamp\": {\"hour\": 12, \"second\": 0}}";
		Schema schema = new Schema.Parser().parse(getSchema().toString());
		System.out.println(jsonToAvro(json, schema));

        // Code borrowed from the Avro-Tools project
	private static String jsonToAvro(String json, Schema schema)
			throws IOException {
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		PrintStream out = new PrintStream(new BufferedOutputStream(baos));
		GenericDatumReader<Object> reader = new GenericDatumReader<Object>(schema);
		InputStream input = new ByteArrayInputStream(json.getBytes("utf-8"));
		JsonDecoder jsonDecoder = DecoderFactory.get().jsonDecoder(schema,input);
		GenericDatumWriter<Object> writer = new GenericDatumWriter<Object>(schema);
		Encoder e = EncoderFactory.get().binaryEncoder(out, null);
		Object datum = null;
		while (true) {
			try {
				datum = reader.read(datum, jsonDecoder);
			} catch (EOFException eofException) {
			writer.write(datum, e);
		return baos.toString("utf-8");

This message was sent by Atlassian JIRA

View raw message