Die Reihenfolge der Eigenschaften ist nicht definiert, so würde ich erwarten, dass die Reihenfolge der Eigenschaften in JSON auch nicht definiert werden. Allerdings finde ich Newtonsoft.Json eine bestimmte Reihenfolge zu erwarten, wenn Referenzen (ich verwende PreserveReferencesHandling = PreserveReferencesHandling.All
). Es erwartet, dass die Eigenschaft $id
die erste vorkommende Eigenschaft in JSON ist.Json.Net Problem mit der Reihenfolge der Referenz-Eigenschaften in JSON
Ich habe
string cyclicJson1 = "{\"FirstChild\":{\"OtherChild\":{\"OtherChild\":{\"$ref\":\"1\"},\"Parent\":{\"$ref\":\"0\"},\"$id\":\"2\"},\"Parent\":{\"$ref\":\"0\"},\"$id\":\"1\"},\"SecondChild\":{\"$ref\":\"2\"},\"$id\":\"0\"}\"";
mit dem folgenden Test zu diesem Schluss kam
nicht richtig deserilized werden kann (einige Referenzen sind null
, die nicht soll) durch Newtonsoft.Json wo, wie der folgenden Möglichkeiten:
string cyclicJson2 = "{\"$id\": \"0\",\"FirstChild\": {\"$id\": \"1\",\"OtherChild\": {\"$id\": \"2\",\"OtherChild\": {\"$ref\": \"1\"},\"Parent\": {\"$ref\": \"0\"}},\"Parent\": {\"$ref\": \"0\"},},\"SecondChild\": {\"$ref\": \"2\"}}";
Der einzige Unterschied ist, dass ich die $id
Eigenschaft nach vorne verschoben, so dass es das erste Element für jedes Objekt ist.
Die Klassen sind wie folgt definiert:
class CycleTestParent
{
public CycleTestChild FirstChild { get; set; }
public CycleTestChild SecondChild { get; set; }
public CycleTestParent()
{
FirstChild = new CycleTestChild();
SecondChild = new CycleTestChild();
}
}
private class CycleTestChild
{
public CycleTestParent Parent { get; set; }
public CycleTestChild OtherChild { get; set; }
}
Gibt es eine Möglichkeit, dass ich mit Newtonsoft.Json ohne anzunehmen, dass die $id
Eigenschaft immer zuerst eintritt arbeiten können? Gibt es eine andere Möglichkeit, als die JSON-Zeichenfolge manuell neu zu sortieren?