Десериализация JSON со значением свойства по умолчанию не работает - PullRequest
0 голосов
/ 16 октября 2018

Я использую 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 совпадают.Однако если я не инициализирую поле FileDataDto someProperty для SomePropertyDto.Default,

private SomePropertyDto someProperty;// = SomePropertyDto.Default;

, оно будет работать правильно.Если я включу инициализацию в значение по умолчанию

private SomePropertyDto someProperty = SomePropertyDto.Default;

после десериализации fileData1, значение SomeProperty будет равно 1, как и ожидалось.Однако после десериализации fileData2 значение SomeProperty экземпляров fileData1 и FileData2 равно 2, что не соответствует ожидаемому.

1 Ответ

0 голосов
/ 16 октября 2018

Согласно 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), если вам нужно это значение по умолчанию.

...