Wie kann ich ein custom root-Knoten beim serialisieren eines Objekts mit JSON.NET?
Habe ich Hinzugefügt eine benutzerdefinierte Eigenschaft, um einige meiner Objekte wie diese:
[JsonCustomRoot("status")]
public class StatusDTO
{
public int StatusId { get; set; }
public string Name { get; set; }
public DateTime Created { get; set; }
}
Das Attribut ist sehr einfach:
public class JsonCustomRoot :Attribute
{
public string rootName { get; set; }
public JsonCustomRoot(string rootName)
{
this.rootName = rootName;
}
}
Die Standard-Ausgabe aus JSON.NET beim serialisieren wird eine Instanz eines Objekts ist diese:
{"StatusId":70,"Name":"Closed","Created":"2012-12-12T11:50:56.6207193Z"}
Nun ist die Frage: Wie kann ich ein root-Knoten, um die JSON mit dem Wert des benutzerdefinierten Attributs, wie so:
{status:{"StatusId":70,"Name":"Closed","Created":"2012-12-12T11:50:56.6207193Z"}}
Ich gefunden habe, mehrere Artikel zu erwähnen, die IContractResolver - Schnittstelle, aber ich kann nicht begreifen, wie es zu tun. Meine versuche, auch diese noch unfertige Stück code:
protected override JsonObjectContract CreateObjectContract(Type objectType)
{
JsonObjectContract contract = base.CreateObjectContract(objectType);
var info = objectType.GetCustomAttributes()
.SingleOrDefault(t => (Type)t.TypeId==typeof(JsonCustomRoot));
if (info != null)
{
var myAttribute = (JsonCustomRoot)info;
//How can i add myAttribute.rootName to the root from here?
//Maybe some other method should be overrided instead?
}
return contract;
}
Ich bin auch auf der Suche nach so etwas, ich will nicht wickeln meine Antworten auf die Controller für jeden
Im Idealfall würde ich gerne, mache fast das gleiche wie deins, aber ich würde es wieder wie ein array, auch wenn nur ein Objekt zurückgegeben.e.g:
Ich gebloggt über eine Lösung speziell für web-api im emadibrahim.com/2014/04/09/...
GET
ich war auf der Suche nach einem Weg, dies zu tun, als entweder eine Einstellung oder ein benutzerdefiniertes Attribut für jedes Modell.Im Idealfall würde ich gerne, mache fast das gleiche wie deins, aber ich würde es wieder wie ein array, auch wenn nur ein Objekt zurückgegeben.e.g:
{status:[{"StatusId":70,"Name":"Closed","Created":"2012-12-12T11:50:56.6207193Z"}]}
. Auch der Versuch mit IContractResolver
und JSON.NETIch gebloggt über eine Lösung speziell für web-api im emadibrahim.com/2014/04/09/...
InformationsquelleAutor Espo | 2012-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine Lösung speziell für Web-API, die ich auch mit: RootFormatter.cs
Ich schrieb es basierend auf Erstellen eines JSONP-Formatierer für ASP.NET Web-API.
Anstelle der Verwendung eines benutzerdefinierten Attributs bin ich wiederverwenden Titel-Feld der
JsonObjectAttribute
. Hier ein Verwendungs-code:Fügen Sie dann RootFormatter zu Ihrem App_Start und registrieren Sie es wie folgt in
WebApiConfig
:War ich in der Lage, eine gewickelt Antwort ähnlich WCF
WebMessageBodyStyle.Wrapped
:InformationsquelleAutor Eugene Yokota
Was ist, wenn Sie ein anonymes Objekt?
InformationsquelleAutor BuddhiP
Einen sehr einfachen Weg, dies zu erreichen, besteht darin, das Objekt in ein anderes Objekt. es ist vielleicht ein mehr als simpel war, es zu betrachten, aber das funktioniert bei der Arbeit mit Kollektionen und einzigartige Objekte.
Nun, wenn Sie setzen die StatusDTO innerhalb der statusJsonModel Objekt und serialisiert als Json. Es sollten geben Sie Ihre gewünschte Antwort.
InformationsquelleAutor Benjishk
Ich hatte ähnliche Herausforderung in meinem Projekt. Unten ist der Schritt, den ich nahm, das problem zu beheben.
1. Meine Entity-Klasse
2. Erstellt eine andere Klasse, die definiert ist, in dieser form.
3. Die Web-API-controller, das wird json zurückgeben
4. Fügen Sie diese Zeile von code zu meinem WebApi Config-Datei im App_Start-Ordner
bitte beachten Sie, dass Newtonsoft.Json.PreserveReferencesHandling.Keine, wird nicht beibehalten Verweis von der serialize-Typ
Die daraus resultierende Json ist
InformationsquelleAutor Myron Willliam Echenim