json 为什么反序列化附加到初始化的'List< T>'而不是覆盖它?

5lhxktic  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(107)

我有一个与配置相关的数据模型,要求所有属性都有默认值,以确保正确执行消费操作。

public class Sample {
    public List<int> Integers { get; set; }
    public Sample() =>
        Integers = new List<int> { 1 };
}

此模型应至少包含一个值,因此我们根据预定义的要求指定默认处理值。但是,该值不必特定为1,如果客户端指定不同的值或多个不同的值,则我们的流程应考虑它们的输入。假设客户端指定要反序列化到模型中的以下json配置:

{
    "integers": [ 2, 3 ]
}

在运行时,我们直接加载配置,但是为了解决这个问题,我们使用一个本地变量string

using Newtonsoft.Json
...
string configuration = "{ \"integers\": [ 2, 3 ] }";
var sample = JsonConvert.DeserializeObject<Sample>(configuration);
Console.WriteLine(string.Join(",", sample.Integers));

上述代码片段应生成以下输出:
1,2,3
正如您在下面的截图中所看到的,情况就是这样:

但是,我的问题是为什么...为什么反序列化过程要追加到集合中而不是覆盖它?

a6b3iqyw

a6b3iqyw1#

您可以指出如何反序列化json

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

var sample = JsonConvert.DeserializeObject<Sample>(configuration,serializerSettings);

Console.WriteLine(string.Join(",", sample.Integers)); // [2,3]

默认情况下,它是自动的,如果有什么东西,它会尝试添加。

相关问题