C# 当使用FromObject反序列化时,Newtonsoft.JSON会附加列表

C# 当使用FromObject反序列化时,Newtonsoft.JSON会附加列表,c#,serialization,collections,constructor,json.net,C#,Serialization,Collections,Constructor,Json.net,我已经使用Newtonsoft.JSON.Linq和JObject.ToObject()将问题简化为这段示例代码 这里的问题是,在Test的构造函数中,将默认值添加到列表Nums。但是,如果我序列化然后反序列化对象,Newtonsoft不会替换列表,而是附加到构造函数设置的值 我无法更改反序列化过程,因为它位于核心库中 如何在不重复的情况下为列表设置默认值?谢谢 class Test { public List<int> Nums { get; set; } = new Li

我已经使用
Newtonsoft.JSON.Linq
JObject.ToObject()将问题简化为这段示例代码

这里的问题是,在
Test
的构造函数中,将默认值添加到列表
Nums
。但是,如果我序列化然后反序列化对象,Newtonsoft不会替换列表,而是附加到构造函数设置的值

我无法更改反序列化过程,因为它位于核心库中

如何在不重复的情况下为列表设置默认值?谢谢

class Test
{
    public List<int> Nums { get; set; } = new List<int>();

    public Test()
    {
        // add default value
        this.Nums.Add(0);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Test job = new Test(); // job.Nums.Count == 1

        JObject jJob = JObject.FromObject(job);

        job = jJob.ToObject<Test>(); // job.Nums.Count == 2
    }
}
类测试
{
公共列表Nums{get;set;}=new List();
公开考试()
{
//添加默认值
此.Nums.Add(0);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
Test job=new Test();//job.Nums.Count==1
JObject jJob=JObject.FromObject(作业);
job=jJob.ToObject();//job.Nums.Count==2
}
}

创建采用默认值的ctor重载

class Test
{
    public List<int> Nums { get; set; }

    public Test()
    {
        this.Nums = new List<int>();
    }

    public Test(int def) : this()
    {
        this.Nums.Add(def);
    }
}
类测试
{
公共列表Nums{get;set;}
公开考试()
{
this.Nums=新列表();
}
公共测试(intdef):this()
{
此.Nums.Add(def);
}
}
用法如下:

public class Program
{
    public static void Main(string[] args)
    {
        Test job = new Test(0); 
        Console.WriteLine(job.Nums.Count);

        JObject jJob = JObject.FromObject(job);

        job = jJob.ToObject<Test>();
        Console.WriteLine(job.Nums.Count); // This is 1 again.
    }
}
公共类程序
{
公共静态void Main(字符串[]args)
{
测试作业=新测试(0);
Console.WriteLine(job.Nums.Count);
JObject jJob=JObject.FromObject(作业);
job=jJob.ToObject();
Console.WriteLine(job.Nums.Count);//这又是1。
}
}

您需要告诉它如何反序列化对象

var serializer = new JsonSerializer { 
                        ObjectCreationHandling = ObjectCreationHandling.Replace 
                };
job = jJob.ToObject<Test>(serializer);
var serializer=newjsonserializer{
ObjectCreationHandling=ObjectCreationHandling.Replace
};
job=jJob.ToObject(序列化程序);

反序列化后正确地为您提供1项。

从OP
我无法更改反序列化过程,因为这是在核心库中。
这看起来很有希望
公共测试(bool init=true)
工作,因为Newtonsoft将使用默认值bool
default(bool)调用构造函数
忽略auto参数为false,代码将遵循该参数。然后你可以有一个if语句。