Avro's JSON encoding requires that non-null union values be tagged
with their intended type.  This is because unions like
["bytes","string"] and ["int","long"] are ambiguous in JSON, the first
are both encoded as JSON strings, while the second are both encoded as
JSON numbers.

http://avro.apache.org/docs/current/spec.html#json_encoding

Thus your record must be encoded as:

{"name": "Alyssa", "favorite_number": {"int": 7}, "favorite_color": null}

Doug

On Mon, Dec 15, 2014 at 7:27 AM, Emre Sevinc <[email protected]> wrote:
> Hello,
>
> I'm trying to validate a JSON file using an Avro schema and write the
> corresponding Avro file. First, I've defined the following Avro schema named
> user.avsc:
>
> {"namespace": "example.avro",
>  "type": "record",
>  "name": "user",
>  "fields": [
>      {"name": "name", "type": "string"},
>      {"name": "favorite_number",  "type": ["int", "null"]},
>      {"name": "favorite_color", "type": ["string", "null"]}
>  ]
> }
>
> Then created a user.json file:
>
> {"name": "Alyssa", "favorite_number": 7, "favorite_color": null}
>
> And then tried to run:
>
> java -jar ~/bin/avro-tools-1.7.7.jar fromjson --schema-file user.avsc
> user.json > user.avro
>
> But I get the following exception:
>
> Exception in thread "main" org.apache.avro.AvroTypeException: Expected
> start-union. Got VALUE_NUMBER_INT
>     at org.apache.avro.io.JsonDecoder.error(JsonDecoder.java:697)
>     at org.apache.avro.io.JsonDecoder.readIndex(JsonDecoder.java:441)
>     at
> org.apache.avro.io.ResolvingDecoder.doAction(ResolvingDecoder.java:290)
>     at org.apache.avro.io.parsing.Parser.advance(Parser.java:88)
>     at
> org.apache.avro.io.ResolvingDecoder.readIndex(ResolvingDecoder.java:267)
>     at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:155)
>     at
> org.apache.avro.generic.GenericDatumReader.readField(GenericDatumReader.java:193)
>     at
> org.apache.avro.generic.GenericDatumReader.readRecord(GenericDatumReader.java:183)
>     at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:151)
>     at
> org.apache.avro.generic.GenericDatumReader.read(GenericDatumReader.java:142)
>     at org.apache.avro.tool.DataFileWriteTool.run(DataFileWriteTool.java:99)
>     at org.apache.avro.tool.Main.run(Main.java:84)
>     at org.apache.avro.tool.Main.main(Main.java:73)
>
>
> Am I missing something? Why do I get "Expected start-union. Got
> VALUE_NUMBER_INT".
>
>
> --
> Emre Sevinç

Reply via email to