如何基于父元素名称为JSON Schema的DefaultValue设置不同类型(Json.Net)
解决方案
JSON Schema 示例
直接针对指定的父元素名称,分别定义其内部DefaultValue的类型:
{ "type": "object", "properties": { "TestTestForm1": { "type": "object", "properties": { "DefaultValue": { "type": "number" } }, "required": ["DefaultValue"] // 根据需求决定是否必填 }, "TestForm2": { "type": "object", "properties": { "DefaultValue": { "type": "string" } }, "required": ["DefaultValue"] // 根据需求决定是否必填 } } }
该Schema的验证规则:
- 父元素为
TestTestForm1时,其下的DefaultValue必须是数字类型 - 父元素为
TestForm2时,其下的DefaultValue必须是字符串类型
C# 实现示例(使用Json.Net库)
先确保已安装Newtonsoft.Json.Schema NuGet包,再通过手动构建Schema对象实现需求:
using Newtonsoft.Json.Schema; // 构建根级Schema var rootSchema = new JsonSchema { Type = JsonSchemaType.Object }; // 配置TestTestForm1对应的子Schema var testTestForm1Schema = new JsonSchema { Type = JsonSchemaType.Object, Properties = { ["DefaultValue"] = new JsonSchema { Type = JsonSchemaType.Number } }, Required = { "DefaultValue" } // 可选,若需要DefaultValue必填则保留 }; rootSchema.Properties.Add("TestTestForm1", testTestForm1Schema); // 配置TestForm2对应的子Schema var testForm2Schema = new JsonSchema { Type = JsonSchemaType.Object, Properties = { ["DefaultValue"] = new JsonSchema { Type = JsonSchemaType.String } }, Required = { "DefaultValue" } // 可选,若需要DefaultValue必填则保留 }; rootSchema.Properties.Add("TestForm2", testForm2Schema); // 输出Schema的JSON字符串 string schemaJson = rootSchema.ToString(); Console.WriteLine(schemaJson);
补充说明
你之前尝试的allOf+if/then写法无效,是因为该语法主要用于基于属性值的条件判断,而非属性名称。针对固定的父元素名称,直接在properties中为每个特定键定义专属结构,是最直接有效的方案。
内容的提问来源于stack exchange,提问作者Mateusz
相关产品推荐
相关产品推荐

