You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avro.apache.org by "Dean Ericson (JIRA)" <ji...@apache.org> on 2015/06/24 13:18:05 UTC

[jira] [Created] (AVRO-1687) Converting JSON to avro fails

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
{code}
	@BeforeClass
	public static void testGenerateSchema() throws IOException {
	             /************************************************
		      * GENERATE SCHEMA
		      ************************************************/
		// 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);
			schemaWiter.close();
		}

		assertNotNull(schemaFile);
		assertTrue(schemaFile.length() > 0);
	}


	@Test
	public void testAvroJsonToBinarySerialization() throws Exception {

	             /************************************************
		      * SERIALIZE JSON
		      ************************************************/
		String json = "{\"cost\": 0, \"stamp\": {\"hour\": 12, \"second\": 0}}";
		Schema schema = new Schema.Parser().parse(getSchema().toString());
		System.out.println(schema);
		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) {
				break;
			}
			writer.write(datum, e);
			e.flush();
		}
		return baos.toString("utf-8");
	}
{code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)