【问题标题】:JSON Schema custom message for oneOfoneOf 的 JSON Schema 自定义消息
【发布时间】:2016-06-22 18:21:41
【问题描述】:

有没有办法为 json 模式 (tv4) 在 oneOf 字段失败时设置自定义消息?

我看到大约一年前 herehere 出现了一个自定义消息问题,但是有没有办法让这个问题适用于这样的事情?

{
    "id": "code",
    "description": "Schema for request.body - pin for logging into the bank",
    "oneOf": [
        {
            "type": "string",
            "pattern": "^.*\\S.*$"
        },
        {
            "type": "object",
            "properties": {
                "type": {
                    "type": "string",
                    "pattern": "^(encrypted|not_encrypted)$"
                },
                "value": {
                    "type": "string",
                    "pattern": "^.*\\S.*$"
                }
            }
        }
    ],
    "messages": {
        "oneOf": "Code does not match schema"
    }
}

相对于仅仅看到Data does not match any schemas from \"oneOf\",你可以看到Code does not match schema

[编辑]

我正在尽我所能阅读 tv4 代码,我看到了很多关于自定义错误消息和代码的信息,例如

defineError: function (codeName, codeNumber, defaultMessage) {
    if (typeof codeName !== 'string' || !/^[A-Z]+(_[A-Z]+)*$/.test(codeName)) {
        throw new Error('Code name must be a string in UPPER_CASE_WITH_UNDERSCORES');
    }
    if (typeof codeNumber !== 'number' || codeNumber%1 !== 0 || codeNumber < 10000) {
        throw new Error('Code number must be an integer > 10000');
    }
    if (typeof ErrorCodes[codeName] !== 'undefined') {
        throw new Error('Error already defined: ' + codeName + ' as ' + ErrorCodes[codeName]);
    }
    if (typeof ErrorCodeLookup[codeNumber] !== 'undefined') {
        throw new Error('Error code already used: ' + ErrorCodeLookup[codeNumber] + ' as ' + codeNumber);
    }
    ErrorCodes[codeName] = codeNumber;
    ErrorCodeLookup[codeNumber] = codeName;
    ErrorMessagesDefault[codeName] = ErrorMessagesDefault[codeNumber] = defaultMessage;
    for (var langCode in languages) {
        var language = languages[langCode];
        if (language[codeName]) {
            language[codeNumber] = language[codeNumber] || language[codeName];
        }
    }
},

我可以通过简单的一行tv4.defineError('MY_CUSTOM_CODE_ERROR', 999999, "Hello World, you have a custom code error"); 用它自己的状态代码(通过这个函数)添加我自己的错误。如何将此错误与此特定 json 架构相关联?如果我完全在错误的地方,那么请有人指出这一点

【问题讨论】:

标签: jsonschema tv4


【解决方案1】:

我偶然发现了您在 GitHub 上的帖子,试图找到一种解决方案,将自定义消息添加到“anyOf”、“oneOf”子句。这对我有用: 见 here

tv4.setErrorReporter(function (error, data, schema) {
// Last component of schemaPath, which *most* of the time is the keyword!
var lsP = error.schemaPath.split('/').splice(-1);
return schema.messages && schema.messages[lsP];
});

你的架构定义是这样的:

{
"id": "code",
"description": "Schema for request.body - pin for logging into the bank",
"oneOf": [
    {
        "type": "string",
        "pattern": "^.*\\S.*$"
    },
    {
        "type": "object",
        "properties": {
            "type": {
                "type": "string",
                "pattern": "^(encrypted|not_encrypted)$"
            },
            "value": {
                "type": "string",
                "pattern": "^.*\\S.*$"
            }
        }
    }
],
"messages": {
    "oneOf": "Code does not match schema"
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    • 2017-06-24
    • 2014-03-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多