使用C#进行条件JSON序列化

时间:2015-03-20 18:24:39

标签: c# json serialization

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

    [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序列化吗?

1 个答案:

答案 0 :(得分:1)

您似乎正在使用DataContractJsonSerializer。在这种情况下,您可以:

  1. 使用属性[IgnoreDataMember]停止对属性的直接序列化。
  2. 为序列化创建代理stringbool?属性,在不应序列化时返回null。这些可以是private
  3. 在这些代理属性上设置[DataMember(EmitDefaultValue=false)]以禁止输出空值。
  4. 因此:

    [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.NETdata contract attributes