C# JSON序列化之谜

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

我有一个MyParameters对象,它有一个“自动重置”功能,可以将它的一些子对象值初始化为默认值。在本例中,除了过滤器列表之外,所有值似乎都是从用户发送的Json对象中写入的。见下文

MyController.cs:

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);