gpt4 book ai didi

c# - NSwag 自定义 JSON 输出

转载 作者:行者123 更新时间:2023-12-03 22:18:21 30 4
gpt4 key购买 nike

我有一个类:

class Test {
public IPAddress Ip {get; set; }
}

默认情况下,Nswag( Nswag.AspNetCore 包)位于 http://localhost:1234/swagger在预览“示例”输出中将其序列化:
[    
"Ip": {
"AddressFamily": 0,
"ScopeId": 0,
"IsIPv6Multicast": true,
"IsIPv6LinkLocal": true,
"IsIPv6SiteLocal": true,
"IsIPv6Teredo": true,
"IsIPv4MappedToIPv6": true,
"Address": 0
}
]

我想自定义它,以便它仅将 Ip 字段序列化为 string没有 IPAddress 的所有其他类型属性.

为此,我创建了自己的 JsonConverter :
public class IPAddressConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(IPAddress));
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
writer.WriteValue(value.ToString());
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
return IPAddress.Parse((string)reader.Value);
}
}

并验证它适用于 JSON.Net。
var settings = new JsonSerializerSettings() { Converters =  { new IPAddressConverter() } };
JsonConvert.SerializeObject(IPAddress.Parse("123.123.123.123"), settings);
JsonConvert.DeserializeObject<IPAddress>("123.123.123.123", settings);

现在我想把它插入到 NSwag 中。我在 ASP.Net 的 Startup.cs 中像这样修改了 NSwag 设置:
    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseMvc();

var swaggerSettings = new SwaggerUi3Settings()
{
ContractResolver = new CustomSwaggerContractResolver(),
DefaultPropertyNameHandling = NJsonSchema.PropertyNameHandling.Default /* If this is not set to default it raises an exception when a ContractResolver is set and then swagger page does not load at all */
};

app.UseSwaggerUi3(typeof(Startup).Assembly, swaggerSettings);
}

#
public class CustomSwaggerContractResolver : DefaultContractResolver
{
protected override JsonContract CreateContract(Type objectType)
{
JsonContract contract = base.CreateContract(objectType);

if (objectType == typeof(IPAddress))
{
contract.Converter = new IPAddressConverter();
}

return contract;
}
}

不幸的是,当我浏览到 http://localhost:1234/swagger查看我的 Test 的 Json“示例”输出类,它仍然包括 IPAddress 的所有属性而不是 Ip字段被序列化为一个简单的 string .

当我调试时,我可以在 CustomSwaggerContractResolver 中看到该代码被调用,转换器被分配,但 IPAddressConverter本身永远不会被调用。

有什么我想念的吗?

谢谢你。

最佳答案

因为转换器的转换不能被反射(reflect)(它是程序性的)你需要添加一个类型映射器

https://github.com/RSuter/NJsonSchema/wiki/Type-Mappers

并将 ipaddress 类型映射到一个简单的字符串模式

(NJsonSchema 是 NSwag 的基础)

关于c# - NSwag 自定义 JSON 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48622459/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com