我有一门课:
class Test {
public IPAddress Ip {get; set; }
}默认情况下,http://localhost:1234/swagger的Nswag (Nswag.AspNetCore包)会将其序列化,如预览"Example“输出所示:
[
"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 "Example“输出时,它仍然包含IPAddress的所有属性,而不是将Ip字段序列化为一个简单的string。
当我调试时,我可以看到CustomSwaggerContractResolver内部的代码被调用,转换器被赋值,但是IPAddressConverter本身从未被调用过。
我是不是漏掉了什么?
谢谢。
发布于 2018-05-09 06:19:35
因为转换器的转换不能被反映(它是过程化的),所以您需要添加类型映射器
https://github.com/RSuter/NJsonSchema/wiki/Type-Mappers
并将ipaddress类型映射到一个简单的字符串架构
(NJsonSchema是NSwag的基础)
https://stackoverflow.com/questions/48622459
复制相似问题