Swashbuckle 重命名模型中的数据类型
Swashbuckle rename Data Type in Model
我正在构建一个需要匹配外部源 XML 格式的网络 API,并且希望重命名 swagger 输出中的数据类型对象。
它在 class 的成员上运行良好,但我想知道是否也可以覆盖 class 名称。
示例:
[DataContract(Name="OVERRIDECLASSNAME")]
public class TestItem
{
[DataMember(Name="OVERRIDETHIS")]
public string toOverride {get; set;}
}
在生成的输出中我最终看到
型号:
TestItem {
OVERRIDETHIS (string, optional)
}
我希望看到
OVERRIDECLASSNAME {
OVERRIDETHIS(字符串,可选)
}
这可能吗?
谢谢,
我遇到了同样的问题,我想我现在已经解决了。
首先在Swagger Configuration中添加SchemaId(从5.2.2版本开始见https://github.com/domaindrivendev/Swashbuckle/issues/457):
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.SchemaId(schemaIdStrategy);
[...]
}
然后添加这个方法:
private static string schemaIdStrategy(Type currentClass)
{
string returnedValue = currentClass.Name;
foreach (var customAttributeData in currentClass.CustomAttributes)
{
if (customAttributeData.AttributeType.Name.ToLower() == "datacontractattribute")
{
foreach (var argument in customAttributeData.NamedArguments)
{
if (argument.MemberName.ToLower() == "name")
{
returnedValue = argument.TypedValue.Value.ToString();
}
}
}
}
return returnedValue;
}
希望对您有所帮助。
很老的问题了,但是当我在寻找类似的解决方案时,我遇到了这个问题。
我认为文森特答案中的代码可能无法正常工作。
这是我的看法:
private static string schemaIdStrategy(Type currentClass)
{
var dataContractAttribute = currentClass.GetCustomAttribute<DataContractAttribute>();
return dataContractAttribute != null && dataContractAttribute.Name != null ? dataContractAttribute.Name : currentClass.Name;
}
添加到线程中,因为我无法使用 Swashbukle for AspNetCore 的答案。
我正在做这个。但是我并不完全高兴,因为好像 object 包含在另一个 object 中,它显示了它的原始名称。例如,如果您的结果集是分页显示的结果 incorrectly.So 这不是最终答案,但可能适用于简单的用例。
我正在使用架构过滤器。 object 只有 [JsonObject(Title="CustomName")] 因为我得到了数据类型的标题 属性。
首先像这样定义一个class:
public class CustomNameSchema : ISchemaFilter
{
public void Apply(Schema schema, SchemaFilterContext context)
{
if (schema?.Properties == null)
{
return;
}
var objAttribute = context.SystemType.GetCustomAttribute<JsonObjectAttribute>();
if( objAttribute!= default && objAttribute?.Title?.Length > 0)
{
schema.Title = objAttribute.Title;
}
}
}
启动时必须配置 SchemaFilter
c.SchemaFilter<CustomNameSchema>();
我正在构建一个需要匹配外部源 XML 格式的网络 API,并且希望重命名 swagger 输出中的数据类型对象。
它在 class 的成员上运行良好,但我想知道是否也可以覆盖 class 名称。
示例:
[DataContract(Name="OVERRIDECLASSNAME")]
public class TestItem
{
[DataMember(Name="OVERRIDETHIS")]
public string toOverride {get; set;}
}
在生成的输出中我最终看到 型号:
TestItem {
OVERRIDETHIS (string, optional)
}
我希望看到
OVERRIDECLASSNAME { OVERRIDETHIS(字符串,可选) }
这可能吗?
谢谢,
我遇到了同样的问题,我想我现在已经解决了。
首先在Swagger Configuration中添加SchemaId(从5.2.2版本开始见https://github.com/domaindrivendev/Swashbuckle/issues/457):
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.SchemaId(schemaIdStrategy);
[...]
}
然后添加这个方法:
private static string schemaIdStrategy(Type currentClass)
{
string returnedValue = currentClass.Name;
foreach (var customAttributeData in currentClass.CustomAttributes)
{
if (customAttributeData.AttributeType.Name.ToLower() == "datacontractattribute")
{
foreach (var argument in customAttributeData.NamedArguments)
{
if (argument.MemberName.ToLower() == "name")
{
returnedValue = argument.TypedValue.Value.ToString();
}
}
}
}
return returnedValue;
}
希望对您有所帮助。
很老的问题了,但是当我在寻找类似的解决方案时,我遇到了这个问题。 我认为文森特答案中的代码可能无法正常工作。 这是我的看法:
private static string schemaIdStrategy(Type currentClass)
{
var dataContractAttribute = currentClass.GetCustomAttribute<DataContractAttribute>();
return dataContractAttribute != null && dataContractAttribute.Name != null ? dataContractAttribute.Name : currentClass.Name;
}
添加到线程中,因为我无法使用 Swashbukle for AspNetCore 的答案。 我正在做这个。但是我并不完全高兴,因为好像 object 包含在另一个 object 中,它显示了它的原始名称。例如,如果您的结果集是分页显示的结果 incorrectly.So 这不是最终答案,但可能适用于简单的用例。
我正在使用架构过滤器。 object 只有 [JsonObject(Title="CustomName")] 因为我得到了数据类型的标题 属性。 首先像这样定义一个class:
public class CustomNameSchema : ISchemaFilter
{
public void Apply(Schema schema, SchemaFilterContext context)
{
if (schema?.Properties == null)
{
return;
}
var objAttribute = context.SystemType.GetCustomAttribute<JsonObjectAttribute>();
if( objAttribute!= default && objAttribute?.Title?.Length > 0)
{
schema.Title = objAttribute.Title;
}
}
}
启动时必须配置 SchemaFilter
c.SchemaFilter<CustomNameSchema>();