【问题标题】:Modifying data contract of value field修改值字段的数据契约
【发布时间】: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


【解决方案1】:

只需将合约变量设为可空类型,这将允许来自用户的空值,然后您可以将它们视为默认值

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多