Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.Net Core 2.2-输入和输出的单独序列化程序设置_C#_.net_Asp.net Core_Json.net_Asp.net Core 2.2 - Fatal编程技术网

C# ASP.Net Core 2.2-输入和输出的单独序列化程序设置

C# ASP.Net Core 2.2-输入和输出的单独序列化程序设置,c#,.net,asp.net-core,json.net,asp.net-core-2.2,C#,.net,Asp.net Core,Json.net,Asp.net Core 2.2,ASP.Net Core 2.2允许使用MvcJsonOptions.SerializerSettings属性设置序列化程序设置。问题是它同时影响输入和输出。有没有一种方法可以为输入(反序列化)和输出(序列化)提供单独的选项?特别是,我需要为NullValueHandlingsettings设置不同的行为:在反序列化客户端json时忽略不可为null的字段的null错误,但在序列化结果时保留已定义模型字段的null 例如,我有一个用于请求的C#模型: public class SomeEntit

ASP.Net Core 2.2允许使用
MvcJsonOptions.SerializerSettings
属性设置序列化程序设置。问题是它同时影响输入和输出。有没有一种方法可以为输入(反序列化)和输出(序列化)提供单独的选项?特别是,我需要为
NullValueHandling
settings设置不同的行为:在反序列化客户端json时忽略不可为null的字段的null错误,但在序列化结果时保留已定义模型字段的null

例如,我有一个用于请求的C#模型:

public class SomeEntity
{
    public int Id { get; set; }
    public int? ParentId { get; set; }
    public string Name { get; set; }
}
并输入JSON:
{id:null,parentId:null,name:“test”}
。对于
NullValueHandling,反序列化失败。包括
但可用于
NullValueHandling。忽略

但是当我序列化一个像这样的实体时

new SomeEntity
{
    Id = 1,
    ParentId = null,
    Name = "test"
}
它通过
NullValueHandling保持null。包括
{id:1,parentId:null,name:“test”}
但通过
NullValueHandling将其删除。忽略
{id:1,name:“test”}


我需要实现输入的“忽略”场景和输出的“包含”。

我将使用Newtonsoft.Json中的JsonSerializerSettings类定义两个实例
mySerializeSetting
myDeserializeSettings

using Newtonsoft.Json;
using Microsoft.Rest.Serialization;

string requestContent = SafeJsonConvert.SerializeObject(value, mySerializationSettings);
要反序列化:

var result = SafeJsonConvert.DeserializeObject<myclass>(input, myDeserializeSettings);
var result=SafeJsonConvert.DeserializeObject(输入,myDeserializeSettings);

要了解如何设置序列化设置,请参见最终找到此解决方法:

公共类CustomSerializerSettingsSetup:IConfigureOptions
{
私人只读iLogger工厂(loggerFactory);
私有只读ArrayPool\u charPool;
私有只读ObjectPoolProvider\u ObjectPoolProvider;
公共CustomSerializerSettingsSetup(
伊洛格工厂伐木厂,
ArrayPool charPool,
ObjectPoolProvider(ObjectPoolProvider)
{
_loggerFactory=loggerFactory;
_charPool=charPool;
_objectPoolProvider=objectPoolProvider;
}
公共无效配置(MVCOPIONS选项)
{
options.OutputFormatters.RemoveType();
options.InputFormatters.RemoveType();
options.InputFormatters.RemoveType();
var outputSettings=new JsonSerializerSettings();
添加(新的JsonOutputFormatter(outputSettings,_charPool));
var inputSettings=new JsonSerializerSettings();
var jsonInputLogger=_loggerFactory.CreateLogger();
options.InputFormatters.Add(新JsonInputFormatter(
jsonInputLogger,
输入设置,
_查尔普,
_对象池(提供者);
var jsonInputPatchLogger=_loggerFactory.CreateLogger();
options.InputFormatters.Add(新的JsonPatchInputFormatter(
jsonInputPatchLogger,
输入设置,
_查尔普,
_对象池(提供者);
}
}

services.TryAddEnumerable(
servicescriptor.Transient());

在服务提供商配置中,我知道如何使用Newtonsoft.Json处理它。问题是如何为ASP.NETCore2.2提供不同的设置
public class CustomSerializerSettingsSetup : IConfigureOptions<MvcOptions>
{
    private readonly ILoggerFactory _loggerFactory;
    private readonly ArrayPool<char> _charPool;
    private readonly ObjectPoolProvider _objectPoolProvider;

    public CustomSerializerSettingsSetup(
        ILoggerFactory loggerFactory,
        ArrayPool<char> charPool,
        ObjectPoolProvider objectPoolProvider)
    {
        _loggerFactory = loggerFactory;
        _charPool = charPool;
        _objectPoolProvider = objectPoolProvider;
    }

    public void Configure(MvcOptions options)
    {
        options.OutputFormatters.RemoveType<JsonOutputFormatter>();
        options.InputFormatters.RemoveType<JsonInputFormatter>();
        options.InputFormatters.RemoveType<JsonPatchInputFormatter>();

        var outputSettings = new JsonSerializerSettings();
        options.OutputFormatters.Add(new JsonOutputFormatter(outputSettings, _charPool));

        var inputSettings = new JsonSerializerSettings();
        var jsonInputLogger = _loggerFactory.CreateLogger<JsonInputFormatter>();
        options.InputFormatters.Add(new JsonInputFormatter(
            jsonInputLogger,
            inputSettings,
            _charPool,
            _objectPoolProvider));

        var jsonInputPatchLogger = _loggerFactory.CreateLogger<JsonPatchInputFormatter>();
        options.InputFormatters.Add(new JsonPatchInputFormatter(
            jsonInputPatchLogger,
            inputSettings,
            _charPool,
            _objectPoolProvider));
    }
}
services.TryAddEnumerable(
    ServiceDescriptor.Transient<IConfigureOptions<MvcOptions>, CustomSerializerSettingsSetup>());