【发布时间】:2017-10-30 09:22:20
【问题描述】:
我必须使用 .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:
NULL kann nicht 在 einen Werttyp konvertiert werden。bei System.Web.Script.Serialization.ObjectConverter.ConvertObjectToTypeMain(Object o, Type type, JavaScriptSerializer serializer, Boolean throwOnError, Object&convertedObject)
bei System.Web.Script.Serialization.ObjectConverter.AssignToPropertyOrField(Object propertyValue, Object o, String memberName, JavaScriptSerializer serializer, Boolean throwOnError) ...
我可以修改反序列化器以实现所需的数据合同吗?如果可以,怎么做?
【问题讨论】:
-
你不能让变量可以为空吗,我认为这会在不改变序列化程序的情况下解决你的问题
-
是这种类型的问题 (
PrintJob) 还是您对许多其他类型有同样的问题? -
@Evk 我希望以后其他类型也有同样的问题,否则数据契约会不一致——这是唯一比奇怪的数据契约更糟糕的事情。
-
我认为你在使用
JavascriptSerializer时运气不佳(除非你可以使用自定义 JavascriptConverter)。
标签: c# json serialization