修改值字段的数据契约

时间:2017-10-30 09:22:20

标签: c# json serialization

我必须使用.NET内置类进行JSON反序列化,并找到System.Web.Script.Serialization

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
return serializer.Deserialize<T>(str)

无法切换到Newtonsoft.Json,因为这将是一个不需要的依赖项。我有以下C#类作为反序列化目标:

public class PrintJob {
    public bool PrintWeekends = true;
    public int NumberOfCopies = 2;
}

但是根据数据合同,发件人可能也会发送null值来表明使用了虚假值:

{PrintWeekends: null, NumberOfCopies: null}

相当于

{PrintWeekends: false, NumberOfCopies: 0}

这种奇怪的数据合同无法轻易改变。当然,所选的反序列化器默认不会忽略null,并抛出错误:

  

System.InvalidOperationException:
  在iinen Werttyp konvertiert werden的NULL kann nicht。

     

bei System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o,Type type,JavaScriptSerializer serializer,Boolean throwOnError,Object&amp; convertedObject)
  bei System.Web.Script.Serialization.ObjectConverter.AssignToPropertyOrField(Object propertyValue,Object o,String memberName,JavaScriptSerializer serializer,Boolean throwOnError)   ...

我可以修改反序列化器以满足所需的数据合同吗?如果是,那么如何?

1 个答案:

答案 0 :(得分:2)

简单地将契约变量设为可为空的类型,这也允许来自用户的空值,然后您可以将它们视为默认值

public class PrintJob {
    public bool? PrintWeekends = true;
    public int? NumberOfCopies = 2;
}