JSON序列化之谜

时间:2018-04-07 15:22:43

标签: c# json serialization

我有一个MyParameters对象有一个"自动重置"将某些子对象值初始化为默认值的功能。在这种情况下,似乎所有值都是从用户发送的Json对象中重写,除了Filters列表。见下文..

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 };
            ...
        }
    }
}

来自UI的请求如下所示:

{  
   "Options":{  
      "Filters":[  
         1,
         3,
         4,
         5
      ],
      ...
}

如何强制覆盖过滤器而不是附加到对象上的默认值。

修改

我结合了评论和答案agnelsix put并通过添加

使其工作
services.AddMvc()
        .AddJsonOptions(options => options.SerializerSettings.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace);

在Startup.cs。

2 个答案:

答案 0 :(得分:2)

这就是JSON如何与列表一起使用。

您可以使用ObjectCreationHandling options更改此行为:

var settings = new JsonSerializerSettings
{
    ObjectCreationHandling = ObjectCreationHandling.Replace
};

var jsonString = "{\"Options\":{\"Filters\":[1,2,3,4,5]}}";
var deserialize = JsonConvert.DeserializeObject<MyParameters>(jsonString, settings);

答案 1 :(得分:0)

在反序列化中,不调用构造函数,只初始化所有属性。 因此无论你在构造函数中初始化什么都将被覆盖。如果您仍希望保持构造函数值不变,请在序列化完成后调用Reset()方法,如使用OnDeserializedAttribute