JSchemaGenerator多维数组



我有一个包含属性int[,] MyProperty的类MyClass

当使用new JSchemaGenerator().Generate(typeof(MyClass))生成json模式时,该模式包含

"MyProperty": {
"type": "array",
"items": {
"type": "integer"
}
}

而我期望模式包含如下所示的数组数组(即多维数组(

"MyProperty": {
"type": "array",
"items": {
"type": [
"array",
"null"
],
"items": {
"type": "integer"
}
}
}

请注意,JSchemaGenerator确实为锯齿状数组T[][]生成了所需的输出。

  • 为什么交错数组和多维数组的模式生成不同
  • 有没有一个属性可以放在多维数组属性的顶部,以更正模式生成

我不相信JSON Schema标准支持";矩形阵列";constraint,请参阅如何在JSON Schema中定义二维矩形数组确认。事实上,Json。NET模式为2d数组生成1d数组模式似乎是一个纯粹的bug。

作为一种变通方法,使用自定义JSchemaGenerationProvider,可以为N维多维数组生成N维锯齿状数组模式。这样的模式不会捕获所有行都具有相同长度的约束,但它至少会捕获正确的数组嵌套深度。

首先,定义以下JSchemaGenerationProvider:

public class MultidimensionalArraySchemaProvider : JSchemaGenerationProvider
{
public override JSchema GetSchema(JSchemaTypeGenerationContext context)
{
if (CanGenerateSchema(context))
{
// Create a jagged N-d array type.
var type = context.ObjectType.GetElementType().MakeArrayType();
for (int i = context.ObjectType.GetArrayRank(); i > 1; i--)
// Disallow null array items for outer arrays
// context.Generator.DefaultRequired controls whether null is allowed for innermost array items.
type = typeof(ArrayRow<>).MakeGenericType(type);
// Return a schema for the jagged N-d array type.
return context.Generator.Generate(type);
}
else
throw new NotImplementedException();
}

public override bool CanGenerateSchema(JSchemaTypeGenerationContext context) => 
context.ObjectType.IsArray && context.ObjectType.GetArrayRank() > 1;
}
[JsonArray(AllowNullItems = false)]
class ArrayRow<T> : List<T> { }

然后,如果你的课看起来像:

public class MyClass 
{
public int[,] MyProperty { get; set; }
public string[,,,] MyProperty4D { get; set; }
}

你可以做:

var generator = new JSchemaGenerator();
generator.GenerationProviders.Add(new MultidimensionalArraySchemaProvider());
var schema = generator.Generate(typeof(MyClass));           

结果:

{
"type": "object",
"properties": {
"MyProperty": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "integer"
}
}
},
"MyProperty4D": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": [
"string",
"null"
]
}
}
}
}
}
},
"required": [
"MyProperty",
"MyProperty4D"
]
}

在这里演示小提琴。

相关问题:

  • 如何在JSON模式中制作二维数组-答案显示如何为具有预定、固定大小的2d数组创建JSON模式。您的问题并不表示您的MyProperty数组具有已知的行长度,但如果具有,则此问题将显示如何创建适当的模式。

  • 检查json中的两个数组是否具有相同的大小-答案:当前不可能。

  • JSON架构将两个属性比较为等长数组-Jason Desrosiers的回答:在JSON架构中,所有验证关键字的范围都是它所应用的值。换句话说,你不能根据另一个值来验证一个值

相关内容

  • 没有找到相关文章

最新更新