2016-08-08 7 views
3

Есть много вопросов и ответов на stackoverflow по теме, но никто не помогает.Avro: deserialize json - схема с необязательными полями

У меня есть схема с дополнительным значением:

{ 
"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: Expected field name not found: errorData

Единственный способ, который работает в формате JSON

}

Есть ли способ десериализации JSON без этой области?

Другой вопрос: когда это поле здесь, я должен написать

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

}

Есть ли способ десериализации "нормальный":

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

?

+0

Вы используете scala? – 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 смог используйте значения по умолчанию для пропущенных полей, но больше не можете это делать. –

Смежные вопросы