C# 修改值字段的数据协定
我必须使用.NET内置类进行JSON反序列化,并找到C# 修改值字段的数据协定,c#,json,serialization,C#,Json,Serialization,我必须使用.NET内置类进行JSON反序列化,并找到System.Web.Script.Serialization: var serializer = new System.Web.Script.Serialization.JavaScriptSerializer(); return serializer.Deserialize<T>(str) 但根据数据合同,发送方也可以发送一个null值,以指示将使用falsy值: {PrintWeekends: null, NumberOfC
System.Web.Script.Serialization
:
var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
return serializer.Deserialize<T>(str)
但根据数据合同,发送方也可以发送一个null
值,以指示将使用falsy值:
{PrintWeekends: null, NumberOfCopies: null}
相当于
{PrintWeekends: false, NumberOfCopies: 0}
这种奇怪的数据契约无法轻易改变。当然,所选的反序列化程序在默认情况下不会忽略null
,并抛出一个错误:
系统无效操作异常:空值不能包含在所有的数据中 bei System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(对象o,类型类型,JavaScriptSerializer序列化程序,布尔throwOnError,对象和convertedObject)
bei System.Web.Script.Serialization.ObjectConverter.AssignToPropertyOrField(对象propertyValue、对象o、字符串成员名、JavaScriptSerializer序列化程序、布尔throwOnError)
我可以修改反序列化程序以满足所需的数据约定吗?如果可以,如何修改?只需将约定变量设置为可空类型,这将允许用户也使用空值,然后您可以将它们视为默认值
public class PrintJob {
public bool? PrintWeekends = true;
public int? NumberOfCopies = 2;
}
只需将契约变量设置为可为null的类型,这将允许用户也使用null值,然后您就可以将它们视为默认值
public class PrintJob {
public bool? PrintWeekends = true;
public int? NumberOfCopies = 2;
}
你不能将变量设为null吗?我认为这可以解决你的问题,而不改变序列化。这是一个仅此类型(
PrintJob
)的问题,还是许多其他类型都有相同的问题?@Evk我希望将来其他类型也会有相同的问题,否则,数据契约将不一致-这是唯一比奇怪的数据契约更糟糕的事情。我认为您使用JavascriptSerializer
(除非您可以使用自定义JavascriptConverter)。您不能使变量为空吗,我认为这将解决您的问题,而不会改变您对这种类型(PrintJob
)的问题,或者您对许多其他类型也有同样的问题?@Evk我希望将来我对其他类型也会有同样的问题,否则,数据契约将不一致——这是唯一比奇怪的数据契约更糟糕的事情。我认为使用JavascriptSerializer
(除非您可以使用自定义JavascriptConverter)。