Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Avro:使用可选字段反序列化json模式_Json_Avro - Fatal编程技术网

Avro:使用可选字段反序列化json模式

Avro:使用可选字段反序列化json模式,json,avro,Json,Avro,关于这个问题有很多问题和答案,但没有人能帮上忙 我有一个具有可选值的架构: { "type" : "record", "name" : "UserSessionEvent", "namespace" : "events", "fields" : [ { "name" : "username", "type" : "string" }, { "name" : "errorData", "type" : [ "null", "string" ], "defau

关于这个问题有很多问题和答案,但没有人能帮上忙

我有一个具有可选值的架构:

{
 "type" : "record",
 "name" : "UserSessionEvent",
 "namespace" : "events",
 "fields" : [ {
   "name" : "username",
   "type" : "string"
 }, {
   "name" : "errorData",
   "type" : [ "null", "string" ],
   "default" : null
 }]
}
我正在尝试使用此字段反序列化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:未找到预期的字段名:errorData

唯一有效的方法是json

{
 "username" : "2271AE67-34DE-4B43-8839-07216C5D10E1",
 "errorData" : null
}

有没有一种方法可以不使用此字段反序列化json

另一个问题:当这个字段在这里时,我应该写

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

有没有反序列化“普通”json的方法:


?案例1在java中运行良好

{
"username" : "2271AE67-34DE-4B43-8839-07216C5D10E1",
"errorData" : { "string":"070226AC-9B91-47CE-85FE-15AA17972298"}
}
对于案例2,您的模式是为union定义的。您可以如下所示更新模式以反序列化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
               }]
}

您使用的是scala吗?您解决过这个问题吗?对于上述两种模式,是否可以从消息中消除
errorData
?意思是,
{“username”:“2271AE67-34DE-4B43-8839-07216C5D10E1”}
是否可以成为有效的消息?看起来在提交之前()Avro GenericDatumReader可以对跳过的字段使用默认值,但不再可以。IIUC接受答案的第二部分不正确。如果未提供值,将使用默认值。但是null的类型为null而不是string,因此这将不起作用。要修复此问题,可以使用类型[“string”,“null”]。因此,这将允许您省略
errorData
,但会阻止您传递“普通”json。所以IIUC,AVRO设计是有缺陷的,因为它不允许使用正常的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
               }]
}