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
}]
}