C#中使用Confluent.Apache.Avro GenericRecord处理含数组的Avro Schema
如何用Confluent .NET Avro库创建含数组类型的GenericRecord?
你遇到的问题核心是混淆了数组Schema和RecordSchema的类型——variables字段的Schema是ArraySchema,而非RecordSchema,所以不能直接用GenericRecord来初始化它。Confluent .NET Avro库中专门提供了GenericArray<T>类型来处理数组类型的字段,下面是完整的正确实现:
修正后的完整代码
var schema = (RecordSchema)Avro.Schema.Parse(File.ReadAllText("asvc/PersonalizationCustomerState_Payload.avsc")); var record = new GenericRecord(schema); // 填充consumer_id字段 record.Add("consumer_id", "10"); // 处理variables数组字段 if (((RecordSchema)schema).TryGetField("variables", out Field variablesField)) { // 将variables字段的Schema转为ArraySchema var variablesArraySchema = (ArraySchema)variablesField.Schema; // 获取数组元素对应的KeyValue RecordSchema var keyValueRecordSchema = (RecordSchema)variablesArraySchema.ItemSchema; // 创建第一个数组元素:KeyValue类型的GenericRecord var keyValue1 = new GenericRecord(keyValueRecordSchema); keyValue1.Add("name", "favorite_category"); keyValue1.Add("value", "electronics"); // 创建第二个数组元素:演示value为null的情况(符合Schema的default设置) var keyValue2 = new GenericRecord(keyValueRecordSchema); keyValue2.Add("name", "notification_preference"); keyValue2.Add("value", null); // 或者可以不设置,因为Schema中value的default是null // 初始化GenericArray并添加元素 var variablesArray = new GenericArray<GenericRecord>(variablesArraySchema); variablesArray.Add(keyValue1); variablesArray.Add(keyValue2); // 将数组赋值给主record的variables字段 record.Add("variables", variablesArray); }
关键知识点解析
识别Schema类型:
variables字段的Schema是ArraySchema,而非RecordSchema,所以必须用GenericArray<T>来实例化,其中T是数组元素的类型(这里是GenericRecord,因为元素是KeyValue这个Record类型)。获取数组元素的Schema:
通过ArraySchema.ItemSchema可以拿到数组元素对应的KeyValueRecordSchema,用它来创建每个数组元素的GenericRecord。处理联合类型字段:
value字段是["null", "string"]的联合类型,且默认值为null,所以可以直接赋值为null,或者不设置该字段(会自动使用默认值)。
如果需要批量添加多个数组元素,只需要循环创建GenericRecord并加入GenericArray即可。
内容的提问来源于stack exchange,提问作者Chathuri Gunawardhana
相关产品推荐
相关产品推荐

