我有一个类,我在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序列化吗?
答案 0 :(得分:1)
您似乎正在使用DataContractJsonSerializer
。在这种情况下,您可以:
[IgnoreDataMember]
停止对属性的直接序列化。string
和bool?
属性,在不应序列化时返回null。这些可以是private
。[DataMember(EmitDefaultValue=false)]
以禁止输出空值。 因此:
[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。