[ 
https://issues.apache.org/jira/browse/AVRO-1636?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Thiruvalluvan M. G. resolved AVRO-1636.
---------------------------------------
    Resolution: Won't Fix

The issue is not specific to C++ implementation and rare. As mentioned earlier, 
the could would read JSON produced by Avro. If the JSON comes from elsewhere, 
it might fail. Since JSON format exists primarily for debugging purpose and not 
for storing production data, I'm resolving this issue as "won't fix".

> C++ JsonDecoder expects json object to be ordered
> -------------------------------------------------
>
>                 Key: AVRO-1636
>                 URL: https://issues.apache.org/jira/browse/AVRO-1636
>             Project: Apache Avro
>          Issue Type: Bug
>          Components: c++
>    Affects Versions: 1.7.7
>            Reporter: Mann Du
>            Priority: Major
>
> I am using  Shafquat Rahman's original post for this problem reported in Avro 
> user mailing list in last May for the description - ( Thiru provided a fix 
> for the exact problem for Java in Oct. 2011 with Avro-895.)
> I have been experimenting with avro in C++ (version 1.7.5) and ran into an 
> issue with the json decoder which expects ordered json objects. The problem I 
> am seeing appears similar to this post I found for an older avro java library:
> http://search-hadoop.com/m/7WG37aVaBd/v=plain
> I have a simple record:
> {
>     "name" : "SimpleRecord",
>     "type" : "record",
>     "fields" :[ 
>         { "name" : "A", "type" : "int"},
>         { "name" : "B", "type" : "int"}
>     ]
> }
> I generate the C++ header using avrogencpp. The generated  code has 
> codec_traits specialization for SimpleRecord that fixes the order for the 
> JsonEncoder and JsonDecoder.
> ...snip...
> namespace avro {
> template<> struct codec_traits<SimpleRecord> {
>     static void encode(Encoder& e, const SimpleRecord& v) {
>         avro::encode(e, v.A);
>         avro::encode(e, v.B);
>     }
>     static void decode(Decoder& d, SimpleRecord& v) {
>         avro::decode(d, v.A);
>         avro::decode(d, v.B);
>     }
> };
> ...snip...
> The JsonDecoder successfully decodes json objects of the form{"A" : 1, "B" : 
> 2} into SimpleRecord. But if I try to decode {"B" : 2, "A" : 1} it throws 
> 'avro::Exception' with "Incorrect field" from impl/parsing/JsonCodec.cc:182 
> in the following method:
> JsonDecoderHandler(JsonParser& p) : in_(p) { }
>     size_t handle(const Symbol& s) {
>         switch (s.kind()) {
>         case Symbol::sRecordStart:
>             expectToken(in_, JsonParser::tkObjectStart);
>             break;
>         case Symbol::sRecordEnd:
>             expectToken(in_, JsonParser::tkObjectEnd);
>             break;
>         case Symbol::sField:
>             expectToken(in_, JsonParser::tkString);
>             if (s.extra<string>() != in_.stringValue()) {
>                 throw Exception("Incorrect field");
>             }
>             break;
>         default:
>             break;
>         }
>         return 0;
>     }
> The stack shows that avro::decode(d, v.A) is  the call the eventually causes 
> the exception.
> According to the json spec the fields in a json object are unordered. ...



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

Reply via email to