gpt4 book ai didi

rpc - AVRO 中的数据验证

转载 作者:行者123 更新时间:2023-12-04 19:43:36 25 4
gpt4 key购买 nike

我是 AVRO 的新手,如果这是一个简单的问题,请原谅。
我有一个用例,我使用 AVRO 模式进行记录调用。

假设我有 avro 架构

{
"name": "abc",
"namepsace": "xyz",
"type": "record",
"fields": [
{"name": "CustId", "type":"string"},
{"name": "SessionId", "type":"string"},
]
}

现在,如果输入是这样的
{
"CustId" : "abc1234"
"sessionID" : "000-0000-00000"
}

我想对这些字段使用一些正则表达式验证,并且仅当它采用如上所示的特定格式时才接受此输入。有没有办法在 avro 模式中指定包含正则表达式?

任何其他支持这样的数据序列化格式?

最佳答案

您应该可以使用自定义 logical type为了这。然后,您将直接在架构中包含正则表达式。

例如,以下是在 JavaScript 中实现的方法:

var avro = require('avsc'),
util = require('util');

/**
* Sample logical type that validates strings using a regular expression.
*
*/
function ValidatedString(attrs, opts) {
avro.types.LogicalType.call(this, attrs, opts);
this._pattern = new RegExp(attrs.pattern);
}
util.inherits(ValidatedString, avro.types.LogicalType);

ValidatedString.prototype._fromValue = function (val) {
if (!this._pattern.test(val)) {
throw new Error('invalid string: ' + val);
}
return val;
};

ValidatedString.prototype._toValue = ValidatedString.prototype._fromValue;

以及您将如何使用它:

var type = avro.parse({
name: 'Example',
type: 'record',
fields: [
{
name: 'custId',
type: 'string' // Normal (free-form) string.
},
{
name: 'sessionId',
type: {
type: 'string',
logicalType: 'validated-string',
pattern: '^\\d{3}-\\d{4}-\\d{5}$' // Validation pattern.
}
},
]
}, {logicalTypes: {'validated-string': ValidatedString}});

type.isValid({custId: 'abc', sessionId: '123-1234-12345'}); // true
type.isValid({custId: 'abc', sessionId: 'foobar'}); // false

您可以阅读有关实现和使用逻辑类型的更多信息 here .

编辑:对于 Java 实现,我相信您会想要查看以下类:
  • LogicalType ,您需要扩展的基础。
  • Conversion , 执行数据的转换(或在您的情况下进行验证)。
  • LogicalTypes Conversions ,现有实现的一些示例。
  • TestGenericLogicalTypes ,可以提供有用的起点的相关测试。
  • 关于rpc - AVRO 中的数据验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37279096/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com