/ / Bedingte JSON-Serialisierung mit C # - c #, json, Serialisierung

Bedingte JSON-Serialisierung mit C # - c #, json, Serialisierung

Ich habe eine Klasse, die ich in C # und JSON serialisierenPost zu einem RESTful Web Service. Ich habe eine Anforderung, dass, wenn ein Feld ausgefüllt ist, ein anderes Feld nicht anwesend sein kann. Die Dienstfehler, wenn beide Felder in das JSON-Objekt serialisiert werden. Meine Klasse sieht so aus:

    [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; }
}

Wie in den Kommentaren erwähnt, wenn StringValue einen Wert hat, wird BoolValue nicht in das JSON-Objekt geschrieben. Wenn StringValue leer ist, geben Sie keinen StringValue ein, sondern setzen Sie BoolValue ein.

Ich habe herausgefunden, wie man das mit der XML-Serialisierung macht, aber ich finde keinen Weg, wie dies mit JSON-Serialisierung funktioniert. Gibt es eine bedingte JSON-Serialisierung in C #?

Antworten:

1 für die Antwort № 1

Es scheint, dass Sie das verwenden DataContractJsonSerializer. In diesem Fall können Sie:

  1. Deaktivieren Sie die direkte Serialisierung Ihrer Eigenschaften mit dem Attribut [IgnoreDataMember].
  2. Erstellen Sie einen Proxy string und bool? Eigenschaften für die Serialisierung, die null zurückgeben, wenn sie nicht serialisiert werden sollten. Diese können sein private.
  3. einstellen [DataMember(EmitDefaultValue=false)] auf diesen Proxy-Eigenschaften, um die Ausgabe von Nullen zu unterdrücken.

So:

[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;
}
}
}

Übrigens wird das auch mit funktionieren Json.NET, die respektiert Datenvertragsattribute.