2016-08-08 10 views
3

件名にstackoverflowに関する多くの質問と回答がありますが、助けになるものはありません。Avro:デシリアライズjson - オプションのフィールドを持つスキーマ

私は、オプションの値を持つスキーマがあります。

{ 
"type" : "record", 
"name" : "UserSessionEvent", 
"namespace" : "events", 
"fields" : [ { 
    "name" : "username", 
    "type" : "string" 
}, { 
    "name" : "errorData", 
    "type" : [ "null", "string" ], 
    "default" : null 
}] 
} 

をそして、私はこのフィールドO/WデシリアライズのJSONをしようとしている:

{ 
"username" : "2271AE67-34DE-4B43-8839-07216C5D10E1", 
"errorData" : { "string":"070226AC-9B91-47CE-85FE-15AA17972298"} 
} 

コードを使用:

val reader = new GenericDatumReader[GenericRecord](schema) 
val decoder = DecoderFactory.get().jsonDecoder(schema, json) 
reader.read(null, decoder) 

をし、私は得た:org.apache.avro.AvroTypeException: Expected field name not found: errorData

作品10

唯一の方法は、

このフィールドO/W JSONをデシリアライズする方法はありJSON

}のですか?

もう一つの問題:

{ 
"username" : "2271AE67-34DE-4B43-8839-07216C5D10E1", 
"errorData" : "070226AC-9B91-47CE-85FE-15AA17972298" 
} 

:このフィールドはここにあるとき、私は "普通の" JSONをデシリアライズする方法はあり

{ 
"username" : "2271AE67-34DE-4B43-8839-07216C5D10E1", 
"errorData" : { "string":"070226AC-9B91-47CE-85FE-15AA17972298"} 

}

書くべきか?

+0

スカラーを使用していますか? – shivam

答えて

2

ケース1はjavaで問題なく動作しています。

{ 
"username" : "2271AE67-34DE-4B43-8839-07216C5D10E1", 
"errorData" : { "string":"070226AC-9B91-47CE-85FE-15AA17972298"} 
} 

ケース2あなたのスキーマはユニオン用に定義されています。以下のようにスキーマを更新してjsonを非直列化することができます。

{ 
    "username" : "2271AE67-34DE-4B43-8839-07216C5D10E1", 
    "errorData" : "070226AC-9B91-47CE-85FE-15AA17972298" 
} 

{ 
    "type" : "record", 
    "name" : "UserSessionEvent", 
    "namespace" : "events", 
    "fields" : [ { 
       "name" : "username", 
       "type" : "string" 
      }, { 
       "name" : "errorData", 
       "type" : "string" , 
       "default" : null 
       }] 
} 
+3

上記の2つのスキーマについて、メッセージから 'errorData'を削除することは可能ですか?意味は、 '{" username ":" 2271AE67-34DE-4B43-8839-07216C5D10E1 "}'は有効なメッセージですか? –

+1

このコミットの前のように見えるhttps://github.com/apache/avro/commit/7e4037de2a891fa738aaf8a4fc56f424d6c6833a#diff-c7934590c625ba67bf1b2ad5511a4f58R97(https://issues.apache.org/jira/browse/AVRO-388)Avro GenericDatumReaderはスキップされたフィールドにはデフォルト値を使用しますが、もはやそれはできません。 –

関連する問題