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将使用默认值booldefault(bool)调用构造函数
忽略auto参数为false,代码将遵循该参数。然后你可以有一个if语句。