设置 Asp.Net Core MVC Json 选项

Posted

技术标签:

【中文标题】设置 Asp.Net Core MVC Json 选项【英文标题】:Set Asp.Net Core MVC Json options 【发布时间】:2017-10-17 07:59:34 【问题描述】:

我的项目中的一个类称为AC,具有Address 类型的属性IPEndPoint。这种类型,以及IPAddress,因为默认情况下不能序列化为 JSON 而臭名昭著。因为我需要序列化我的类,所以我实现了两个自定义转换器:IPAddressConverterIPEndPointConverter。为了让 Newtonsoft 使用这两个转换器,我制作了这个类:

public sealed class CustomSettings : JsonSerializerSettings

    public CustomSettings() : base()
    
        this.Converters.Add(new IPAddressConverter());
        this.Converters.Add(new IPEndPointConverter());
        this.TypeNameHandling = TypeNameHandling.Auto;
    
 

..我在我的Main 中使用如下:

Newtonsoft.Json.JsonConvert.DefaultSettings = () => new CustomSettings();

现在我正在尝试将 API 添加到我的程序中。我创建了一个 .Net Core Web API 项目并成功地将其集成到我的程序中。但是,当我尝试编写一个需要来自请求正文的 JSON 形式的 AC 实例的 POST 方法时出现了问题。序列化程序无法转换IPEndPoint,因此AC 的值始终为null

有关 .Net Core API 配置的信息非常少。谁能告诉我如何将这些相同的设置传递给 MVC 的序列化程序?

编辑

我找到了一种方法(有点)。事实证明,您可以在 ConfigureServices 方法中设置 JSON 选项。

我尝试修改 MVC 的序列化程序的设置,就像我对程序的其余部分所做的那样:

services.AddMvc().AddJsonOptions(options => options.SerializerSettings = new CustomSettings());

但是,这不起作用,因为options.SerializerSettings 是只读的。

可以一个接一个地传递转换器,但我希望它们都从一个地方(CustomSettings 类)进行管理。这可能吗?

【问题讨论】:

或者创建一个扩展方法在一个地方为你做这件事,这是我决定的 【参考方案1】:

创建一个封装你想要配置的扩展方法

public static void AddCustomSettings(this Newtonsoft.Json.JsonSerializerSettings settings) 
    settings.Converters.Add(new IPAddressConverter());
    settings.Converters.Add(new IPEndPointConverter());
    settings.TypeNameHandling = TypeNameHandling.Auto;

并在ConfigureServices中配置

services.AddJsonOptions(options => options.SerializerSettings.AddCustomSettings());

【讨论】:

我在另一个项目的Main 中如何称呼这个方法? (而不是做Newtonsoft.Json.JsonConvert.DefaultSettings = () => new CustomSettings(); @Sty,该扩展用于设置 API,您的 main 可以保持不变

以上是关于设置 Asp.Net Core MVC Json 选项的主要内容,如果未能解决你的问题,请参考以下文章

asp.net core 3.1 MVC/WebApi JSON 全局配置

asp.net core序列化json配置,适用于mvc,webapi

asp.net core序列化json配置,适用于mvc,webapi

在 ASP.Net Core MVC 中读取 JSON 发布数据

ASP.NET Core MVC创建并关联JSON配置文件

在 ASP.NET MVC Core 2 中使用 MetadataPropertyHandling 模型绑定 JSON 数据