Wie kann ich ein referenziertes Objekt in zwei json.net-Eigenschaften auf dem Referer reduzieren?

Betrachten Sie die folgende Klasse:

public class User
{
  public virtual int Id {get;set;}
  public virtual string Name {get;set;}
  public virtual User Superior {get;set;}
}

Mein Ziel ist es, dies mit newtonsofts json.net wie folgt als json zu serialisieren:

{
  Id: 101,
  Name: 'Mithon',
  SuperiorId: 100,
  SuperiorName: 'TheMan'
}

Warum möchte ich das tun? Weil ich den Json als meine DTOs verwenden möchte, ohne eine Zwischenschicht von dynamischen Objekten zu erzeugen. Das Generieren der DTOs sollte dynamisch durch Konvention und nicht explizit erfolgen, imho. Ich weiß, einige mögen dem überhaupt nicht zustimmen, aber es geht nicht darum, meinen Ansatz zu diskutieren. Ich möchte nur wissen, ob und wie es geht.

Die Herausforderung ist das VerwendenJsonPropertyAttribute für die Superior-Eigenschaft ergibt sich nur eine Eigenschaft als Ausgabe, für die ich zwei benötige. Wenn ich a benutzeJsonObjectAttribute Ich erhalte ein verschachteltes Attribut und habe Probleme damit, dass der Benutzer der obersten Ebene ebenfalls reduziert wird.

Zum Glück scheint es genug geschützte und / oder öffentliche Eigenschaften und Methoden in der json.net-Bibliothek zu geben, die ich erweitern kann, um das gewünschte Ergebnis zu erzielen. Die Frage ist dann, mit welchen Klassen und Methoden ich anfangen soll, um dorthin zu gelangen, wo ich hin möchte. Wäre das Ableiten von DefaultContractResolver und das Überschreiben der GetProperties-Methode eine gute Option, oder sollte ich anderswo nachsehen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage