如何根据具有联合类型的模式验证json

m3eecexj  于 2021-08-20  发布在  Java
关注(0)|答案(0)|浏览(234)

以下是我的模式:

  1. {
  2. "type":"record",
  3. "name":"UserCreatedEventData",
  4. "namespace":"com.sap.fsm.master.domain.event",
  5. "fields":[
  6. {
  7. "name":"emailAddress",
  8. "type":[
  9. "null",
  10. {
  11. "type":"string",
  12. "avro.java.string":"String"
  13. }
  14. ]
  15. },
  16. {
  17. "name":"id",
  18. "type":[
  19. "long"
  20. ]
  21. },
  22. {
  23. "name":"name",
  24. "type":[
  25. {
  26. "type":"string",
  27. "avro.java.string":"String"
  28. }
  29. ]
  30. }
  31. ]
  32. }

这是我得到的记录:

  1. {
  2. "emailAddress":"string",
  3. "name":"string",
  4. "id":0
  5. }

我使用以下方法在java中验证此记录:

  1. @VisibleForTesting
  2. boolean validateAvroSchemaWithValueTwo(String json, Schema schema) throws Exception {
  3. Map<String, Object> kafkaEvent = CustomRuleUtils.jsonStringToMap((String) json);
  4. GenericRecord genericRecord = new GenericData.Record(schema);
  5. for (Schema.Field field : schema.getFields()) {
  6. genericRecord.put(field.name(), kafkaEvent.get(field.name()));
  7. }
  8. GenericDatumReader<GenericRecord> reader = new GenericDatumReader<GenericRecord>(schema);
  9. boolean data = reader.getData().validate(schema, genericRecord);
  10. return data;
  11. }

然而它总是返回false,有正确的记录。我怀疑这是因为 "avro.java.string":"String" 架构中的属性。在我的单元测试中,我将包含具有类型的模式 "type":["null", "string"] 但在运行时,它是有效的 "avro.java.string":"String" 正在以模式显示。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题