/ C#を使用した条件付きJSONシリアライゼーション - c#、json、シリアライゼーション

条件付きJSONのシリアル化C#を使用して - C#、JSON、シリアル化

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。その場合は、次のことができます。

  1. 属性を使用してプロパティの直接シリアル化を無効にする [IgnoreDataMember].
  2. プロキシを作成する string そして bool? シリアル化してはいけないときに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尊敬する データコントラクト属性.