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の値がJSONオブジェクトにBoolValueを入れないでください。StringValueが空白の場合は、StringValueに入れないでBoolValueに入れてください。
XMLシリアライゼーションでこれを行う方法を見つけましたが、JSONシリアライゼーションでこれが機能する方法を見つけることができません。 C#に条件付きJSONシリアライゼーションはありますか?
回答:
回答№1は1使用しているようです DataContractJsonSerializer
。その場合は、次のことができます。
- 属性を使用してプロパティの直接シリアル化を無効にする
[IgnoreDataMember]
. - プロキシを作成する
string
そしてbool?
シリアル化してはいけないときにnullを返す、シリアル化用のプロパティ。これらはprivate
. - セット
[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尊敬する データコントラクト属性.