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)