C# ASP.Net Core 2.2-输入和输出的单独序列化程序设置
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
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>());