Details
-
Bug
-
Status: Open
-
Major
-
Resolution: Unresolved
-
1.10.2
-
None
-
None
-
Java unit test
Description
The JSON encoding of an AVRO record should be the same when the schema AllowNull or not. In following unit test, the JSON encoded record is incorrect when the schema Allow null:
AvroJsonAllowNullTests.testAvroToJson:82 expected [
{"name":"bob"}] but found {"name":{"string":"bob"}}
import org.apache.avro.generic.GenericDatumWriter; import org.apache.avro.generic.GenericRecord; import org.apache.avro.generic.GenericRecordBuilder; import org.apache.avro.io.DatumWriter; import org.apache.avro.io.EncoderFactory; import org.apache.avro.io.JsonEncoder; import org.apache.avro.reflect.ReflectData; import org.testng.annotations.Test; import java.io.ByteArrayOutputStream; import java.io.OutputStream; import static org.testng.Assert.assertEquals; class AvroJsonAllowNullTests { public static class User { String name; public User(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } /** * Writes provided {@link org.apache.avro.generic.GenericRecord} into the provided * {@link OutputStream} as JSON. */ public static void writeAsJson(org.apache.avro.generic.GenericRecord record, OutputStream out) throws Exception { DatumWriter<GenericRecord> writer = new GenericDatumWriter<GenericRecord>(record.getSchema()); JsonEncoder encoder = EncoderFactory.get().jsonEncoder(record.getSchema(), out); writer.write(record, encoder); encoder.flush(); } @Test public final void testAvroToJson() throws Exception { org.apache.avro.Schema schema = ReflectData.get().getSchema(User.class); org.apache.avro.Schema schemaAllowNull = ReflectData.AllowNull.get().getSchema(User.class); System.out.println("schema=" + schema); System.out.println("schemaAllowNull=" + schemaAllowNull); GenericRecord record = new GenericRecordBuilder(schema) .set("name","bob") .build(); GenericRecord recordAllowNull = new GenericRecordBuilder(schemaAllowNull) .set("name","bob") .build(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baosAllowNull = new ByteArrayOutputStream(); writeAsJson(record, baos); writeAsJson(recordAllowNull, baosAllowNull); System.out.println("record="+baos.toString()); System.out.println("recordAllowNull="+baosAllowNull.toString()); assertEquals(baosAllowNull.toString(), baos.toString()); } }