[
https://issues.apache.org/jira/browse/AVRO-1636?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14297206#comment-14297206
]
Mann Du commented on AVRO-1636:
-------------------------------
Did I mention that I confirmed the same behavior in Avro c++ 1.7.7? Thanks.
-Mann
> C++ JsonDecoder expects json object to be ordered
> -------------------------------------------------
>
> Key: AVRO-1636
> URL: https://issues.apache.org/jira/browse/AVRO-1636
> Project: Avro
> Issue Type: Bug
> Components: c++
> Affects Versions: 1.7.7
> Reporter: Mann Du
>
> 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
(v6.3.4#6332)