Ich versuche, eine JSON-Datei zu generieren, die im Dojo-Javascript-Framework verwendet wird, und möchte ein position
-Attribut zurückgeben, das in einem dojo.place()
-Aufruf verwendet werden soll. Der position
-Parameter kann entweder eine Zahl oder ein String sein.
Die Verwendung des StructLayout
scheint nicht zu funktionieren, da der Serialisierer versuchen würde, sowohl die String- als auch die Integer-Typen auszugeben. Ich überlege, einen benutzerdefinierten ContractResolver
zu erstellen, der das CreatePrimitiveContract
überschreibt, um eine benutzerdefinierte JsonConverter
-Klasse zurückzugeben. Allerdings scheint laut API der JsonConverter
auf Basis des Typs erstellt zu werden und nicht eines spezifischen Objektwerts.
Wie kann ich diesen Fall in C# mit dem Json.NET-Serialisierer behandeln?
Vermutlich würde die Lösung zwei Eigenschaften mit benutzerdefinierten Settern umfassen, um die andere Eigenschaft auf null zu setzen, wenn eine gesetzt wird, zusammen mit einer Art benutzerdefinierter Json.Net-Klasse, um die Werte der Eigenschaften zu inspizieren und nur die nicht-null-Werte zu serialisieren.
** Hypothetisches Beispiel **
// C#-Struktur (oder Klasse)
[StructLayout(LayoutKind.Explicit)]
struct DojoPosition {
[JsonProperty(PropertyName="position")]
[FieldOffset(0)]
public String StrPos;
[JsonProperty(PropertyName="position")]
[FieldOffset(0)]
public Int32 IntPos;
}
// Serialisierungsausgabe
DojoPosition pos;
pos.StrPos = "nur";
var output = JsonConvert.SerializeObject(pos);
// Ausgabe ist: { "position": "nur" }
pos.IntPos = 3;
var output = JsonConvert.SerializeObject(pos);
// Ausgabe ist: { "position": 3 }