gpt4 book ai didi

json - 将 JSON 值限制为其他 JSON 对象的名称

转载 作者:行者123 更新时间:2023-12-05 06:40:31 29 4
gpt4 key购买 nike

我想使用 JSON 架构来验证某些值。我有两个对象,称它们为 trackedItems 和 trackedItemGroups。 trackedItemGroups 是组名称和 trackedItems 名称列表。例如,架构类似于:

"TrackedItems": {
"type": "array",
"items": {
"type": "object",
"properties": {
"TrackedItemName": { "type": "string" },
"Properties": { ---- }
}
}
},
"TrackedItemGroups": {
"type": "array",
"items": {
"type": "object",
"properties": {
"GroupName": {
"type": "string"
},
"TrackedItems": {
"type": "array",
"items": {"type": "string"}
}
}
}
}

我想验证 TrackedItemGroups 中的每个字符串的 TrackedItems array 是在 TrackedItems.TrackedItemName 中定义的名称.

这类似于使用 enum属性来限制值,但是 enum列表是根据 TrackedITems.TrackedItemName 中的值生成的.

如何编写架构以使用 JSON 自己的数据进行验证?

我知道我可以四处移动,即 TrackedItems 定义它们所在的组,但有数百个跟踪项目,而且这种组织方式更适合我的用例。

我已经试过了:

"TrackedItems": {
"type": "array",
"items": {
"oneOf": [
{"$ref":"#/properties/TrackedItems/items/properties/TrackedItemName"}
]
}
}

但这会导致错误:

Newtonsoft.Json.Schema.JSchemaReaderException: Could not resolve schema reference '#/properties/TrackedItems/items/properties/TrackedItemName'.

对于数据示例,如果我有 TrackedItems:

项目 1、项目 2、项目 A、项目 B、项目 C

和组:

第 1 组: Item1, ItemB, ItemC

第 2 组: Item1, Item2, ItemZ

Group2 会引发违规,因为它包含未在 TrackedItems 中定义的项目。

最佳答案

作为验证(以及由琐碎断言描述的某些其他事物)的词汇表,JSON 模式不提供验证数据一致性的方法。

验证意味着像“验证 X 是一个字符串”这样的断言。

一致性意味着诸如“验证 X 是现有活跃用户的 ID”之类的事情。

由于被比较的数据可能完全在另一个数据库中,并且由于这些类型的断言很重要,因此 JSON Schema 将验证数据的一致性留给了应用程序和/或其他技术。一些实现具有用于文档内比较的特定于供应商的扩展,但是这些都不是标准化的,我不知道有什么可以在这里工作。


$ref 引用在这里不起作用,因为它只是一种通过引用替换另一个模式的方法。如果您可以设法使引用起作用(我不确定为什么会出现错误,这是特定于实现的细节),则此模式:

{ "oneOf": [
{"$ref":"#/properties/TrackedItems/items/properties/TrackedItemName"}
] }

与说完全一样:

{ "oneOf": [
{"type": "string"}
] }

既然你问的是“验证以下陈述之一是否为真”,这也等同于简单地:

{"type": "string"}

这并不是说您不能使用 JSON Schema 在 JSON 中声明数据之间的关系,但 JSON Schema 对于使用 URI 和超链接来这样做有些自以为是。

关于json - 将 JSON 值限制为其他 JSON 对象的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42448780/

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