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)

Reply via email to