如何修改JSchema生成的JSON Schema响应中definitions下的类名
实现修改JSON Schema definitions节点名称的方案
你使用的Newtonsoft.Json.Schema组件默认以类名作为definitions节点的键值,DataContract特性不会直接作用于该命名规则,可通过以下两种方式实现需求:
方案1:自定义Schema生成规则(推荐,无硬编码)
通过实现自定义JSchemaGenerationProvider重写类型定义的ID生成逻辑,代码示例如下:
public class CustomTypeNameGenerationProvider : JSchemaGenerationProvider { // 配置类型和自定义definitions名称的映射关系 private readonly Dictionary<Type, string> _typeNameMapping = new Dictionary<Type, string> { { typeof(DemoRequestModel), "models" } }; public override JSchema GetSchema(JSchemaTypeGenerationContext context) { // 如果当前类型在映射列表中,生成带自定义ID的Schema if (_typeNameMapping.TryGetValue(context.ObjectType, out string customName)) { var schema = context.Generator.Generate(context.ObjectType); schema.Id = new Uri(customName, UriKind.RelativeOrAbsolute); return schema; } return null; } public override bool CanGenerate(JSchemaTypeGenerationContext context) { return _typeNameMapping.ContainsKey(context.ObjectType); } }
之后在生成Schema前把自定义Provider添加到生成器中即可:
JSchemaGenerator schemaGen = _schemaGenerator.Value; schemaGen.GenerationProviders.Add(new CustomTypeNameGenerationProvider()); JSchema schemaResult = schemaGen.Generate(typeof(CreateDemoRequest));
方案2:生成后手动修改Schema结构(适合临时调整需求)
如果仅需对当前场景做一次性修改,可在生成Schema后直接调整JSON结构,同时同步更新引用路径:
JSchema schemaResult = schemaGen.Generate(typeof(CreateDemoRequest)); // 修改definitions节点的键名 var definition = schemaResult.Definitions["DemoRequestModel"]; schemaResult.Definitions.Remove("DemoRequestModel"); schemaResult.Definitions.Add("models", definition); // 同步修改引用路径 var modelsProperty = schemaResult.Properties["models"]; modelsProperty.Items.Id = new Uri("#/definitions/models", UriKind.RelativeOrAbsolute);
两种方案最终生成的Schema中,definitions节点下的键都会替换为你需要的models名称,引用路径也会同步更新生效。
内容的提问来源于stack exchange,提问作者akash
相关产品推荐
相关产品推荐

