我已使用Newtonsoft.JSON.Linq
和JObject.ToObject<T>()
这里的问题是在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
}
}
答案 0 :(得分:1)
创建取消默认值的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);
}
}
以下是用法:
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.
}
}
答案 1 :(得分:0)
您需要告诉它如何反序列化对象
var serializer = new JsonSerializer {
ObjectCreationHandling = ObjectCreationHandling.Replace
};
job = jJob.ToObject<Test>(serializer);
反序列化后正确地给你1个项目。