首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSwag自定义JSON输出

NSwag自定义JSON输出
EN

Stack Overflow用户
提问于 2018-02-05 20:20:40
回答 1查看 5.4K关注 0票数 4

我有一门课:

代码语言:javascript
复制
class Test {
  public IPAddress Ip {get; set; }
}

默认情况下,http://localhost:1234/swagger的Nswag (Nswag.AspNetCore包)会将其序列化,如预览"Example“输出所示:

代码语言:javascript
复制
[    
  "Ip": {
     "AddressFamily": 0,
     "ScopeId": 0,
     "IsIPv6Multicast": true,
     "IsIPv6LinkLocal": true,
     "IsIPv6SiteLocal": true,
     "IsIPv6Teredo": true,
     "IsIPv4MappedToIPv6": true,
     "Address": 0
    }
]

我想对它进行自定义,以便它只将Ip字段序列化为string,而不使用IPAddress的所有其他类型属性。

为此,我创建了自己的JsonConverter

代码语言:javascript
复制
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一起工作。

代码语言:javascript
复制
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设置:

代码语言:javascript
复制
    // 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);
 }

代码语言:javascript
复制
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本身从未被调用过。

我是不是漏掉了什么?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-05-09 06:19:35

因为转换器的转换不能被反映(它是过程化的),所以您需要添加类型映射器

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

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

(NJsonSchema是NSwag的基础)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48622459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档