[ 
https://issues.apache.org/jira/browse/AVRO-2137?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16780913#comment-16780913
 ] 

Zoltan Farkas edited comment on AVRO-2137 at 2/28/19 9:06 PM:
--------------------------------------------------------------

I am not seeing this in my fork (https://github.com/zolyfarkas/avro), can you 
please review my attempt to reproduce the issue?:

{code}

package org.apache.avro.io;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.avro.generic.GenericRecord;
import org.junit.Test;

public class JsonDecoderTest {


  private static final String SCHEMA
        = "{\n" +
"  \"type\": \"record\",\n" +
"  \"name\": \"test\",\n" +
"  \"namespace\": \"test.name\",\n" +
"  \"fields\": [\n" +
"    {\n" +
"      \"name\": \"items\",\n" +
"      \"type\": {\n" +
"        \"type\": \"array\",\n" +
"        \"items\": {\n" +
"          \"type\": \"record\",\n" +
"          \"name\": \"items\",\n" +
"          \"fields\": [\n" +
"            {\n" +
"              \"name\": \"name\",\n" +
"              \"type\": \"string\"\n" +
"            },\n" +
"            {\n" +
"              \"name\": \"state\",\n" +
"              \"type\": \"string\"\n" +
"            }\n" +
"          ]\n" +
"        }\n" +
"      }\n" +
"    },\n" +
"    {\n" +
"      \"name\": \"firstname\",\n" +
"      \"type\": \"string\"\n" +
"    }\n" +
"  ]\n" +
"}";


  private static final String testData = "{ \"items\": [\n" +
"\n" +
"{ \"name\": \"dallas\", \"state\": \"TX\", \"country\":\"USA\" }\n" +
"\n" +
"], \"firstname\":\"fname\", \"lastname\":\"lname\" }";

  @Test
  public void testDecoding() throws IOException {
    Schema writerSchema = new Schema.Parser().parse(SCHEMA);
    Schema readerSchema = writerSchema;
    ByteArrayInputStream bis =
            new ByteArrayInputStream(testData.getBytes(StandardCharsets.UTF_8));
    Decoder decoder = DecoderFactory.get().jsonDecoder(writerSchema, bis);
    GenericDatumReader reader = new GenericDatumReader(writerSchema, 
readerSchema);
    GenericRecord testData = (GenericRecord) reader.read(null, decoder);
    System.out.println(testData);
  }

}
{code}

this might be caused by the fact that my fork contains the fix for: 
https://issues.apache.org/jira/browse/AVRO-2057...
or that my attempt to reproduce is broken...


was (Author: zolyfarkas):
I am not seeing this in my fork (https://github.com/zolyfarkas/avro), can you 
please review my attempt to reproduce the issue?:

{code}

package org.apache.avro.io;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import org.apache.avro.Schema;
import org.apache.avro.generic.GenericDatumReader;
import org.apache.avro.generic.GenericRecord;
import org.junit.Test;

public class JsonDecoderTest {


  private static final String SCHEMA
        = "{\n" +
"  \"type\": \"record\",\n" +
"  \"name\": \"test\",\n" +
"  \"namespace\": \"test.name\",\n" +
"  \"fields\": [\n" +
"    {\n" +
"      \"name\": \"items\",\n" +
"      \"type\": {\n" +
"        \"type\": \"array\",\n" +
"        \"items\": {\n" +
"          \"type\": \"record\",\n" +
"          \"name\": \"items\",\n" +
"          \"fields\": [\n" +
"            {\n" +
"              \"name\": \"name\",\n" +
"              \"type\": \"string\"\n" +
"            },\n" +
"            {\n" +
"              \"name\": \"state\",\n" +
"              \"type\": \"string\"\n" +
"            }\n" +
"          ]\n" +
"        }\n" +
"      }\n" +
"    },\n" +
"    {\n" +
"      \"name\": \"firstname\",\n" +
"      \"type\": \"string\"\n" +
"    }\n" +
"  ]\n" +
"}";


  private static final String testData = "{ \"items\": [\n" +
"\n" +
"{ \"name\": \"dallas\", \"state\": \"TX\", \"country\":\"USA\" }\n" +
"\n" +
"], \"firstname\":\"fname\", \"lastname\":\"lname\" }";

  @Test
  public void testDecoding() throws IOException {
    Schema writerSchema = new Schema.Parser().parse(SCHEMA);
    Schema readerSchema = writerSchema;
    ByteArrayInputStream bis =
            new ByteArrayInputStream(testData.getBytes(StandardCharsets.UTF_8));
    Decoder decoder = DecoderFactory.get().jsonDecoder(writerSchema, bis);
    GenericDatumReader reader = new GenericDatumReader(writerSchema, 
readerSchema);
    GenericRecord testData = (GenericRecord) reader.read(null, decoder);
    System.out.println(testData);
  }

}
{code}

this might be caused by the fact that contains the fix for: 
https://issues.apache.org/jira/browse/AVRO-2057...
or that my attempt to reproduce is broken...

> avro JsonDecoding additional field in array type
> ------------------------------------------------
>
>                 Key: AVRO-2137
>                 URL: https://issues.apache.org/jira/browse/AVRO-2137
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: java
>    Affects Versions: 1.8.1
>            Reporter: Arun sethia
>            Priority: Major
>
> I have following avro schema:
> {code:json}
> {
>   "type": "record",
>   "name": "test",
>   "namespace": "test.name",
>   "fields": [
>     {
>       "name": "items",
>       "type": {
>         "type": "array",
>         "items": {
>           "type": "record",
>           "name": "items",
>           "fields": [
>             {
>               "name": "name",
>               "type": "string"
>             },
>             {
>               "name": "state",
>               "type": "string"
>             }
>           ]
>         }
>       }
>     },
>     {
>       "name": "firstname",
>       "type": "string"
>     }
>   ]
> }
> {code}
> when I am using Json decoder and avro encoder to encode Json data (scala 
> code):
>  {code:scala}
> val writer = new GenericDatumWriter[GenericRecord](schema)
> val reader = new GenericDatumReader[GenericRecord](schema)
> val baos = new ByteArrayOutputStream
> val decoder: JsonDecoder = DecoderFactory.get.jsonDecoder(schema, json)
> val encoder = EncoderFactory.get.binaryEncoder(baos, null)
> val datum = reader.read(null, decoder) writer.write(datum, encoder)
> encoder.flush()
> val avroByteArray = baos.toByteArray
>  {code}
> *scenario1:* when I am passing following json to encode it works fine:
> {code:json}
>  {
>   "items": [
>     {
>       "name": "dallas",
>       "state": "TX"
>     }
>   ],
>   "firstname": "arun"
> }
> {code}
>  *scenario2:* when I am passing additional attribute in json at root level 
> (lastname) it is able to encode and works fine:
> {code:json}
> {
>   "items": [
>     {
>       "name": "dallas",
>       "state": "TX"
>     }
>   ],
>   "firstname": "fname",
>   "lastname": "lname"
> }
> {code}
> *scenario3*: when I am add additional attribute in array record (country) it 
> is throwing following exception:
> {code:scala}
> Expected record-end. Got FIELD_NAME org.apache.avro.AvroTypeException: 
> Expected record-end. Got FIELD_NAME at 
> org.apache.avro.io.JsonDecoder.error(JsonDecoder.java:698) { "items": [
> { "name": "dallas", "state": "TX", "country":"USA" }
> ], "firstname":"fname", "lastname":"lname" }
> {code}
>  In case of if we have any additional element in array type, it should work 
> in same way as normal record; it should just discard them and decode the Json 
> data.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to