首页 > 解决方案 > 如何针对具有 UNION 类型的模式验证 Json

问题描述

以下是我的架构:

{
   "type":"record",
   "name":"UserCreatedEventData",
   "namespace":"com.sap.fsm.master.domain.event",
   "fields":[
      {
         "name":"emailAddress",
         "type":[
            "null",
            {
               "type":"string",
               "avro.java.string":"String"
            }
         ]
      },
      {
         "name":"id",
         "type":[
            "long"
         ]
      },
      {
         "name":"name",
         "type":[
            {
               "type":"string",
               "avro.java.string":"String"
            }
         ]
      }
   ]
}

这是我得到的记录:

{
   "emailAddress":"string",
   "name":"string",
   "id":0
}

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

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

但是它总是返回错误,有正确的记录。我怀疑这是因为"avro.java.string":"String"模式中的属性。在我的单元测试中,我包含了具有"type":["null", "string"]有效类型的模式,但在运行时这"avro.java.string":"String"是在模式中出现的。

标签: javajsonschemaavro

解决方案


推荐阅读