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

时间:2016-01-08 01:32:45

标签: c# serialization collections constructor json.net

我已使用Newtonsoft.JSON.LinqJObject.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
    }
}

.Net Fiddle

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个项目。