我发现很难强制反序列化操作实际上失败如果数据与输出类所期望的不完全匹配。
class ContainerClass {
string SomeString { get; set; } // <-- not nullable
}
Json文件:
[
{
"SomeString": null, // <-- null
}
]
反序列化函数:
using JsonTextReader reader = new JsonTextReader(file); // <-- the file I got from my controller.
var serializer = Newtonsoft.Json.JsonSerializer.Create(); // or new Serializer, whatever
serializer.MissingMemberHandling = MissingMemberHandling.Error;
return serializer.Deserialize<Collection<RegisterImportItem>>(reader);
如果字符串为空值,我希望反序列化失败。上面的代码静默地成功,并在非空字段中放置了一个空值。恐怖!
我想通过配置来实现这一点序列化器(如:我不想在字段本身的上方添加一个修饰符)) .
长话短说:I wantall如果值为空,非空字段将失败,无论如何
JSON。NET是在可空引用类型出现之前编写的。最好的方法是使用JsonProperty
属性。
用JsonProperty
注释属性
[JsonProperty(Required = Required.DisallowNull)]
你的json是数组但你想要反序列化对象,试试下面的代码
var json=@"[
{
""SomeString"": null, // <-- null
""JustString"": ""test""
}
]";
var test = JsonConvert.DeserializeObject<ContainerClass[]>(json);
和通过添加一个访问器
来修复类public class ContainerClass {
public string SomeString { get; set; }
public string JustString { get; set; }
}
我想我在这里找到了答案:Json。. NET要求反序列化的所有属性
public class RequireObjectPropertiesContractResolver : DefaultContractResolver
{
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
var contract = base.CreateObjectContract(objectType);
contract.ItemRequired = Required.Always;
return contract;
}
}
var settings = new JsonSerializerSettings { ContractResolver = new RequireObjectPropertiesContractResolver() };
var serializer = Newtonsoft.Json.JsonSerializer.Create(settings);
编辑:这不是正确答案。现在它禁止所有空字段,即使是那些在Container类中可以为空的字段。
没有办法一次在所有字段上实现这一点。唯一的方法是在单独的字段上使用装饰符。