我有一个包含属性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架构中,所有验证关键字的范围都是它所应用的值。换句话说,你不能根据另一个值来验证一个值