c# - 使用 C# 的条件 JSON 序列化

我有一个在 C# 中序列化为 JSON 并发布到 RESTful Web 服务的类。我有一个要求,如果一个字段已填写,则另一个字段不存在。如果两个字段都序列化为 JSON 对象,则服务错误。我的类(class)看起来像这样:

    [DataContract(Name = "test-object")]
public class TestObject
{
    [DataMember(Name = "name")]
    public string Name { get; set; }

    // If string-value is not null or whitespace do not serialize bool-value
    [DataMember(Name = "bool-value")]
    public bool BoolValue { get; set; }

    // If string-value is null or whitespace do not serialize it
    [DataMember(Name = "string-value")]
    public string StringValue { get; set; }
}

如评论中所述,如果 StringValue 有值,请不要将 BoolValue 放入 JSON 对象中。如果 StringValue 为空,则不要输入 StringValue,而是输入 BoolValue。

我找到了如何使用 XML 序列化来执行此操作,但找不到使用 JSON 序列化的方法。 C# 上有条件 JSON 序列化吗?

最佳答案

看来您正在使用 DataContractJsonSerializer .在这种情况下,您可以:

  1. 使用属性 [IgnoreDataMember] 禁用属性的直接序列化.
  2. 为序列化创建代理 stringbool? 属性,在不应序列化时返回 null。这些可以是私有(private)的
  3. 设置[DataMember(EmitDefaultValue=false)]在这些代理属性上以抑制 null 的输出。

因此:

[DataContract(Name = "test-object")]
public class TestObject
{
    [DataMember(Name = "name")]
    public string Name { get; set; }

    [IgnoreDataMember]
    public bool BoolValue { get; set; }

    [IgnoreDataMember]
    public string StringValue { get; set; }

    bool ShouldSerializeStringValue()
    {
        return !String.IsNullOrWhiteSpace(StringValue);
    }

    // If string-value is not null or whitespace do not serialize bool-value
    [DataMember(Name = "bool-value", EmitDefaultValue=false)]
    bool? SerializedBoolValue {
        get
        {
            if (!ShouldSerializeStringValue())
                return BoolValue;
            return null;
        }
        set
        {
            BoolValue = (value ?? false); // Or don't set it at all if value is null - your choice.
        }
    }

    // If string-value is null or whitespace do not serialize it
    [DataMember(Name = "string-value", EmitDefaultValue=false)]
    string SerializedStringValue {
        get
        {
            if (ShouldSerializeStringValue())
                return StringValue;
            return null;
        }
        set
        {
            StringValue = value;
        }
    }
}

顺便说一句,这也适用于 Json.NET , 这尊重 data contract attributes .

https://stackoverflow.com/questions/29173381/

相关文章:

html - 高度以像素为单位,而不是百分比

regex - R - 从文件中读取行的部分匹配

can-bus - 使用 ELM327 接收 CAN 报文时的流量控制报文

clojure - 我如何获得 clojure 中的单元测试列表?

r - Error in `[<-` (`*tmp*` , , 下标越界 下标越界

c# - 从 Roslyn 中的方法符号生成方法签名的语法

camunda - 控制部署的 Camunda BPM 的版本

r - 如何动态更改 R 中现有函数的一行

qt - 如何从 QT 中的 RTSP 流解析 ONVIF 元数据?

c# - 使用 Roslyn 时如何验证方法中的参数类型