MarkLogic中如何用JSON Schema校验Number类型的NaN值?
解决MarkLogic JSON Schema校验不拦截NaN的问题
你遇到的问题核心是:MarkLogic的xdmp:json-validate-node默认将XQuery生成的NaN视为合法的JSON number类型(尽管标准JSON规范里并没有NaN),所以仅用"type": "number"的Schema规则无法拦截它,但TDE的decimal类型严格拒绝非有限数值,导致插入失败。
要让JSON Schema校验拦截NaN(包括Infinity和-Infinity这类特殊数值),可以在Schema中给number类型字段添加not约束,排除这些特殊值。具体做法是在age字段的规则里加入"not": {"enum": [NaN, Infinity, -Infinity]},在XQuery中需要用fn:NaN()、fn:number("Infinity")和fn:number("-Infinity")来构造这些值。
修改后的查询代码如下:
xquery version "1.0-ml"; let $node := object-node { "name": "test", "age": fn:number("fail") } let $schema := object-node { "properties": object-node { "name": object-node { "type": "string" }, "age": object-node{ "type": "number", "not": object-node { "enum": array-node { fn:NaN(), fn:number("Infinity"), fn:number("-Infinity") } } } } } return xdmp:json-validate-node($node, $schema, "full")
执行这段代码后,就会返回预期的校验错误,拦截包含NaN的JSON文档,避免后续TDE插入失败的问题。
内容的提问来源于stack exchange,提问作者JayDip
相关产品推荐
相关产品推荐

