我有一个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。
中答案 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