【问题标题】:JSON Serialization MysteryJSON序列化之谜
【发布时间】:2018-09-17 10:20:35
【问题描述】:

我有一个 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 };
            ...
        }
    }
}

来自 UI 的请求如下所示:

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

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

编辑:

我结合了 cmets 和 agnelsix put 的答案,并通过添加使其工作

services.AddMvc()
        .AddJsonOptions(options => options.SerializerSettings.ObjectCreationHandling = Newtonsoft.Json.ObjectCreationHandling.Replace);

在 Startup.cs 中。

【问题讨论】:

标签: c# json serialization


【解决方案1】:

这就是 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);

【讨论】:

  • 但是我的对象在进入 Post 函数时已经反序列化了,我还要在哪里设置序列化器设置?
  • 您依靠 MVC 序列化程序来做到这一点。你有很多选择。这里有一些stackoverflow.com/questions/44828302/…
  • 哈!我知道有一种方法可以在全球范围内定制这些!!我会尽快尝试并更新您。谢谢
【解决方案2】:

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

【讨论】:

  • 在反序列化中,构造函数不会被调用——这仅适用于BinaryFormatter;应用数据契约属性时的数据契约序列化;正如here 所解释的,在非常罕见的情况下由 Json.NET 解释。事实上,在这个问题中,构造函数被调用,这解释了 OP 看到的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
相关资源
最近更新 更多