2016-06-06 10 views
1

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?

Antwort

1

Was müssen Sie hier MetadataPropertyHandling-MetadataPropertyHandling.ReadAhead zu setzen:

JsonConvert.DefaultSettings =() => new JsonSerializerSettings() 
{      
    MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead 
}; 

standardmäßig für perfomance Gründen Metadaten-Eigenschaften werden voraussichtlich zu Beginn des Objekt JSON befinden. Mit dieser Eigenschaft können Sie das Verhalten des Parsers ändern, um sie an einer beliebigen Stelle im Objekt JSON zu suchen.

Verwandte Themen