属性默认值不起作用的JSON反序列化

时间:2018-10-16 13:58:19

标签: json json.net deserialization

我正在使用Newtonsoft从文件中反序列化数据。当我从两组不同的数据中反序列化两个不同的实例时,两个实例的属性最终都具有相同的值。我创建了一个小项目来解决该问题。这是我的2个JSON文件

File1.json:

{
  "Name": "File1",
  "SomeProperty":
  {
    "Value": 1 
  }
}

File2.json:

{
  "Name": "File2",
  "SomeProperty":
  {
    "Value": 2 
  }
}

SomeProperty.cs

namespace Json
{
  public class SomePropertyDto
  {
    public static SomePropertyDto Default = new SomePropertyDto
    {
      Value = 0
    };

    public int Value { get; set; }
  }
}

FileDataDto.cs

namespace Json
{
  public class FileDataDto
  {
    public string Name { get; set; }

    public SomePropertyDto SomeProperty
    {
      get => someProperty;
      set => someProperty = value;
    }

    private SomePropertyDto someProperty = SomePropertyDto.Default;
  }
}

Program.cs

using System.IO;
using Newtonsoft.Json;

namespace Json
{
  class Program
  {
    static void Main(string[] args)
    {
      string json1 = File.ReadAllText("File1.json");
      string json2 = File.ReadAllText("File2.json");

      FileDataDto fileData1 = JsonConvert.DeserializeObject<FileDataDto>(json1);
      FileDataDto fileData2 = JsonConvert.DeserializeObject<FileDataDto>(json2);
    }
  }
}

反序列化FileDataDto的两个实例后,它们的SomeProperty值都相同。但是,如果我不将FileDataDtotosomeProperty字段初始化为SomePropertyDto.Default,则

private SomePropertyDto someProperty;// = SomePropertyDto.Default;

它正常工作。如果我将初始化包含到默认值

private SomePropertyDto someProperty = SomePropertyDto.Default;

反序列化fileData1之后,SomeProperty值等于预期的1。但是,在反序列化fileData2之后,fileData1和FileData2实例的SomeProperty值都等于2,这不是预期的值。

1 个答案:

答案 0 :(得分:0)

根据https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/JsonSerializerSettings.cs#L46,默认的对象创建设置为“自动”,即https://github.com/JamesNK/Newtonsoft.Json/blob/master/Src/Newtonsoft.Json/ObjectCreationHandling.cs#L34

  

重复使用现有对象,并在需要时创建新对象。

因此,当您的Default对象在那里时,someProperty会保留所有FileDataDto实例的相同共享对象。

如果需要该默认值,请提供自定义的JsonSerializerSettings(将ObjectCreationHandling设置为Replace)。