【问题标题】:Json serialization settings for specific controllers in .NET Core.NET Core 中特定控制器的 Json 序列化设置
【发布时间】:2021-08-19 10:18:07
【问题描述】:

我必须将项目转换为 .NET Core。在源项目中有 2 个控制器,每个控制器都有 1 个端点(方法)。两种方法都返回一个 Customer 对象列表,这些对象以 JSON 格式反序列化返回给调用者。 其中一个控制器有一个特殊的属性:

[SerializationConfiguration(typeof(CustomerSerializationSettings))]

SerializationConfiguration 如下所示,因此在将 Json 结果发送给调用者之前,Json 会通过 HttpControllerSettings 中设置的格式化程序进行更改:

public SerializationConfigurationAttribute(Type jsonSerializerType)
{
    JsonSerializerSettings = (ISerializationSettings)Activator.CreateInstance(jsonSerializerType);
}

public void Initialize(HttpControllerSettings controllerSettings, HttpControllerDescriptor controllerDescriptor)
{
    controllerSettings.Formatters.Remove(controllerSettings.Formatters.JsonFormatter);

    var formatter = JsonSerializerSettings.SerializerSettings.ToFormatter();

    controllerSettings.Formatters.Insert(0, formatter);
}

CustomerSerializationSettings 如下所示:

public class CustomerSerializationSettings : ISerializationSettings
{
    public CustomerSerializationSettings()
    {
        SerializerSettings = new JsonSerializerSettings
        {
            PreserveReferencesHandling = PreserveReferencesHandling.Objects,
            ContractResolver = new EntityContractResolver()
                .AddProperties<CustomerModel>(m => m.XXX)
        };

        DeserializerSettings = new JsonSerializerSettings();
    }

    public JsonSerializerSettings SerializerSettings { get; private set; }
    public JsonSerializerSettings DeserializerSettings { get; private set; }
}

我应该如何在 .NET Core 中实现它? ...我的意思是SerializationConfiguration中的Initialize部分(在.net核心中:属性类中的OnActionExecuting)

【问题讨论】:

    标签: json .net-core serialization controller json.net


    【解决方案1】:

    可以使用类似的ActionFilter属性:

    public class JsonConfigFilterAttribute : ActionFilterAttribute
    {
        public override void OnResultExecuting(ResultExecutingContext context)
        {
            if (context.Result is ObjectResult objectResult)
            {
                var serializerSettings = new JsonSerializerSettings
                {
                    PreserveReferencesHandling = PreserveReferencesHandling.Objects,
                    NullValueHandling = NullValueHandling.Include,
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                };
    
                var jsonOutputFormatter = new NewtonsoftJsonOutputFormatter(
                    serializerSettings,
                    ArrayPool<char>.Shared,
                    new MvcOptions
                    {
                    });
    
                objectResult.Formatters.Add(jsonOutputFormatter);
            }
    
            base.OnResultExecuting(context);
        }
    }
    

    用于序列化(输出)。
    如果需要,还有用于输入的 NewtonsoftJsonInputFormatter(以前的解串器)。
    此代码需要安装 nuget 包 Microsoft.AspNetCore.Mvc.NewtonsoftJson。

    您可以在控制器上使用此类属性,甚至可以在控制器的操作方法上使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-30
      • 2019-10-01
      • 1970-01-01
      • 2020-11-18
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      相关资源
      最近更新 更多