C# JSON序列化之谜
我有一个MyParameters对象,它有一个“自动重置”功能,可以将它的一些子对象值初始化为默认值。在本例中,除了过滤器列表之外,所有值似乎都是从用户发送的Json对象中写入的。见下文 MyController.cs:C# JSON序列化之谜,c#,json,serialization,C#,Json,Serialization,我有一个MyParameters对象,它有一个“自动重置”功能,可以将它的一些子对象值初始化为默认值。在本例中,除了过滤器列表之外,所有值似乎都是从用户发送的Json对象中写入的。见下文 MyController.cs: namespace xx.Controllers { [Authorize("xx")] [Route("api/[controller]")] public class MyController : Controller { p
namespace xx.Controllers
{
[Authorize("xx")]
[Route("api/[controller]")]
public class MyController : Controller
{
public async Task<ActionResult> Post([FromBody]MyParameters parameters)
{
//at this point parameters.Filters include the following:
//[1,2,3,4,5,6,7,1,3,4,5]
...
}
}
public class MyParameters
{
public Options Options { get; set; } = new Options ();
....
}
public class Options
{
public Options () => Reset();
public List<int> Filters { get; set; }
...
public void Reset()
{
this.Filters = new List<int> { 1, 2, 3, 4, 5, 6, 7 };
...
}
}
}
如何强制过滤器重写,而不是附加到对象上的默认值
编辑:
我将这些评论和agnelsix给出的答案结合起来,通过添加
services.AddMvc()
.AddJsonOptions(options => options.SerializerSettings.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace);
在Startup.cs.反序列化中,不调用构造函数,只初始化所有属性。
因此,无论您在构造函数中初始化什么,都将被覆盖。如果仍然希望保持构造函数值不变,则在序列化完成后调用
Reset()
方法,就像在反序列化中使用一样,不会调用构造函数,只初始化所有属性。
因此,无论您在构造函数中初始化什么,都将被覆盖。如果仍然希望保持构造函数值不变,则在序列化完成后调用
Reset()
方法,就像使用JSON处理列表一样
您可以使用ObjectCreationHandling
更改此行为:
var设置=新的JsonSerializerSettings
{
ObjectCreationHandling=ObjectCreationHandling.Replace
};
var jsonString=“{\'选项\':{\'过滤器\':[1,2,3,4,5]}”;
var deserialize=JsonConvert.DeserializeObject(jsonString,设置);
这就是JSON处理列表的方式
您可以使用ObjectCreationHandling
更改此行为:
var设置=新的JsonSerializerSettings
{
ObjectCreationHandling=ObjectCreationHandling.Replace
};
var jsonString=“{\'选项\':{\'过滤器\':[1,2,3,4,5]}”;
var deserialize=JsonConvert.DeserializeObject(jsonString,设置);
但当我的对象进入Post函数时,它已经反序列化了,我甚至可以在哪里设置序列化程序设置?您需要依赖MVC seralizer来完成这项工作。你有很多选择。这里有一些哈!我知道有一种方法可以在全球范围内定制!!我会很快试用并向您更新。谢谢,但是当我的对象进入Post函数时,它已经反序列化了,我甚至可以在哪里设置序列化程序设置呢?你需要依赖MVC seralizer来实现这一点。你有很多选择。这里有一些哈!我知道有一种方法可以在全球范围内定制!!我会很快试用并向您更新。谢谢你的推荐或重复:你使用的是什么版本的MVC?根据版本的不同,您将使用或来反序列化JSON。请参阅相关或重复:和。您使用的是哪个版本的MVC?根据版本的不同,您将使用或来反序列化JSON。请参见反序列化中的内容,未调用构造函数-这仅适用于BinaryFormatter
;应用数据协定属性时的数据协定序列化;如前所述,在非常罕见的情况下,Json.NET会使用Json。事实上,在这个问题中,构造函数被调用,这解释了OP看到的错误。在反序列化中,构造函数没有被调用-这只适用于BinaryFormatter
;应用数据协定属性时的数据协定序列化;如前所述,在非常罕见的情况下,Json.NET会使用Json。事实上,在这个问题上,构造函数被调用,这解释了OP看到的bug。
services.AddMvc()
.AddJsonOptions(options => options.SerializerSettings.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace);
var settings = new JsonSerializerSettings
{
ObjectCreationHandling = ObjectCreationHandling.Replace
};
var jsonString = "{\"Options\":{\"Filters\":[1,2,3,4,5]}}";
var deserialize = JsonConvert.DeserializeObject<MyParameters>(jsonString, settings);