Почему JsonConvert не может инициализировать значения свойств, когда методы getter / setter не являются общими / значениями по умолчанию.
Например, JsonConvert десериализует следующий класс (или, скорее, свойство "Value"), как и должно быть. Скажем, мой Json файл содержит Value = 5, тогда мой десериализованный объект SomeObjectX будет иметь свое свойство "Value" равным 5:
public class SomeClass
{
public int Value { get; set; }
}
Однако, если я хочу, чтобы установщик был немного более сложным и сделай что-то особенное, тогда это не сработает. Вот новый класс:
public class SomeClass
{
public int MinValue { get; set; }
public int MaxValue { get; set; }
private int _value;
public int Value
{
get { return _value; }
set
{
// Restrict range to Min/Max
if (MaxValue < value)
_value = MaxValue;
else if (MinValue > value)
_value = MinValue;
else
_value = value;
}
}
}
Для информации, вот как я вызываю JsonConvert для десериализации в объекты:
SomeClass SomeObjectX = JsonConvert.DeserializeObject<SomeClass>(File.ReadAllText(@"e:\someObject.json"), settings);
Есть ли способ заставить это работать? Другими словами, если мой Json содержит свойство инициализации «Значение», равное 10, то при десериализации я должен установить значение «Значение» на 10.
Редактировать
Сериализованный Json файл выглядит следующим образом:
{
"MaxValue": 10,
"MinValue": 0,
"Value": 5
}
Вот неинициализированный объект, который я получаю во время выполнения (обратите внимание, что «Значение» равно 0, а не 5, как и должно быть):
Вот тест на то, как я создал свой экземпляр объекта, инициализировал его, сохранил его в Json и затем десериализовал его обратно в объект:
// Create and init object
var param = new SomeClass();
param.MaxValue = 10;
param.Value = 5;
// Settings - Not making any difference with or without
JsonSerializerSettings settings = new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All,
ObjectCreationHandling = ObjectCreationHandling.Replace
};
// Serialise into Json
File.WriteAllText(@"e:\param.json", JsonConvert.SerializeObject(param, settings));
// Deserialise back into object
SomeClass obj = JsonConvert.DeserializeObject<SomeClass>(File.ReadAllText(@"e:\param.json"), settings);