Вот что я получил до сих пор. Спасибо Брайану Роджерсу :
public class JsonSerializeTest
{
[Fact]
public void deserialize_test()
{
var settings = new JsonSerializerSettings { ContractResolver = new CustomContractResolver() };
var jsonString = "{\"PropertyA\":\"Test\",\"PropertyB\":null}";
var jsonObject = JsonConvert.DeserializeObject<NoConfigModel>(jsonString, settings);
Assert.NotNull(jsonObject);
}
}
public class NoConfigModel
{
public string PropertyA { get; set; }
public int PropertyB { get; set; }
public bool PropertyC { get; set; }
}
class CustomContractResolver : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
{
JsonProperty property = base.CreateProperty(member, memberSerialization);
property.ShouldDeserialize = instance =>
{
try
{
PropertyInfo prop = (PropertyInfo)member;
if (prop.CanRead)
{
var value = prop.GetValue(instance, null);// getting default value(0) here instead of null for PropertyB
return value != null;
}
}
catch
{
}
return false;
};
return property;
}
}
Моя проблема:
Необходимо установить значение по умолчанию для полей, не допускающих значения Nullable, вместо Exception или для целого объекта, равного NULL. Отсутствие пропущенного значения не является проблемой (дает значение по умолчанию DefaultContractResolver
), но когда в json явно устанавливается значение NULL, равное NULL, то это дает исключение.
Мой код выше близок, но недостаточно близок. Я думаю, что мне нужно найти способ узнать, что значение фактически равно нулю от json и установить ShouldDeserialize =false
для этих случаев.