Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 修改值字段的数据协定_C#_Json_Serialization - Fatal编程技术网

C# 修改值字段的数据协定

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

我必须使用.NET内置类进行JSON反序列化,并找到
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)。