【问题标题】:Optional fields with DataContractJsonSerializer (how to change the default)带有 DataContractJsonSerializer 的可选字段(如何更改默认值)
【发布时间】:2018-09-11 07:39:03
【问题描述】:

我一直在使用DataContractJsonSerializer成功地将一个对象序列化为json。这样做的好处是我可以使用可选字段(可能会或可能不会被序列化)。例如

[DataContract()]
public class aClass
{
  [DataMember()]
  public int member1;
  [DataMember()]
  public int member2;
  [DataMember(EmitDefaultValue=false)]
  public int member3;
}

在这种情况下,当我实例化一个 aClass 类的对象时,我可以将 member1 设置为 1,将 member 2 设置为 2,将 member3 设置为 3。当我序列化它时,我得到了相应的 JSON 字符串。另一方面,如果我只设置 member1 和 member2,则序列化程序在生成 JSON 字符串时会忽略 member3。这非常有用,它不仅适用于整数,还适用于列表、对象等。

现在,我还没有尝试过,但我认为序列化程序将忽略 member3 不仅在未设置时,而且在设置为默认值时(在 int 情况下默认值为 0)。所以只要 member3 是 1 或 2 或 3,它就会被序列化。到目前为止,这是理想的行为。

我的问题来了。

我希望 member3 在设置为 0 或 1、2、3 时被序列化。否则不被序列化。 (例如未设置时)

这甚至可能吗?如何实现?

【问题讨论】:

标签: c# json datacontractjsonserializer


【解决方案1】:

我终于找到了一种方法来做我所要求的。 是的,起初我做了一个能够序列化 0 的 hack,但这是一个涉及保留其他变量的 hack (bool setTo0=false),但后来我发现有一种更简洁更简单的方法。

它正在使用Nullable Types。当您将 int 声明为可空类型时,即使设置为默认值 0,它也会对其进行序列化。唯一不会序列化的情况是最初设置为 null 时(是的,在这种情况下可以将 int 设置为 Null) .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-06
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多