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

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

以下是我的模式:

{
   "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;
}

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

暂无答案!

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

相关问题