Wenn ich mein Page
Objekt serialisiert, fügt Json.Net die $ type Eigenschaft nicht zu meinen Steuerelementen hinzu (die in einem IList
sind), wenn es sie serialisiert. Ich habe versucht, den folgenden Code zu meinem Klassenkonstruktor und zu meinem WebAPI-Startup hinzuzufügen, aber Json.Net fügt immer noch nicht die $ type-Information zu dem Control
es serialisiert hinzu.
JsonConvert.DefaultSettings =() => new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.All,
MetadataPropertyHandling = MetadataPropertyHandling.ReadAhead
};
Zu Testzwecken habe ich die $type
Eigenschaft auf die Steuerung selbst im JSON-Code und Json.Net war richtig deserialize das Objekt der Lage, aber es ist die Serialisierung noch nicht richtig. Hier ist, wie meine Klassen eingerichtet sind.
public class Page {
public Guid Id { get; set; }
public Guid CustomerId { get; set; }
public IList<Control> Controls { get; set; }
}
Und hier ist die Control-Klasse:
public class Control : ControlBase
{
public override Enums.CsControlType CsControlType { get { return Enums.CsControlType.Base; } }
}
Und hier ist die Control abstrakte Klasse:
public abstract class ControlBase
{
public Guid Id { get; set; }
public virtual Enums.CsControlType CsControlType { get; }
public Enums.ControlType Type { get; set; }
public string PropertyName { get; set; }
public IList<int> Width { get; set; }
public string FriendlyName { get; set; }
public string Description { get; set; }
}
Und hier ist die OptionsControl, die von Control abgeleitet:
public class OptionsControl : Control
{
public override Enums.CsControlType CsControlType { get { return Enums.CsControlType.OptionsControl; } }
public IDictionary<string, string> Options;
}
Und das die JSON ist, wie kommt:
"Pages": [
{
"Id": "00000000-0000-0000-0000-000000000000",
"CustomerId": "00000000-0000-0000-0000-000000000000",
"Controls": [
{
"Options": {
"TN": "TN"
},
"CsControlType": 4,
"Id": "00000000-0000-0000-0000-000000000000",
"Type": 4,
"PropertyName": "addresses[0].state",
"Width": [
2,
2,
6
],
"FriendlyName": "State",
"Description": null
}
]
}
]
Wie Sie sehen können, Json.Net haben die $type
Eigenschaft auf die JSON-Objekt hinzufügen. Das Problem ist, dass ich manchmal Json.Net brauche, um mir ein Control
Basisobjekt zu geben, aber manchmal brauche ich es, um mir eine Instanz des OptionsControl
Objekts zu geben (das von Control
erbt). Warum fügt Json.Net den Steuerelementen die Eigenschaft $ type nicht hinzu?
Ich könnte verwirrt sein, '" Typ ": 4,' unterscheidet sich von dem, was Sie nennen '$ Typ' Wie und wo ist das' $ Typ', den Sie verweisen? Können Sie die "gewünschte" Ausgabe hinzufügen, um sie deutlicher zu machen? Ich könnte nur nicht auf das gleiche Ding schauen ... –
Ihr Code funktioniert gut für Standalone-Serialisierung, siehe https://dotnetfiddle.net/gKetpA. Daher müssen Sie ein Framework wie Web-API zum Serialisieren verwenden. Welchen Rahmen verwendest du? Zum Beispiel für MVC 4 Web API siehe [Wie setze ich benutzerdefinierte JsonSerializerSettings für Json.NET in der MVC 4 Web API?] (Https://stackoverflow.com/q/13274625/3744182). Alternativ könnten Sie '' JsonProperty (ItemTypeNameHandling = TypeNameHandling.Auto)] '' zu Ihrer Listeneigenschaft hinzufügen. – dbc
@dbc Ich verwende .NET Core WebAPI. Meine Frage wurde mit diesem Code aktualisiert. Ich habe versucht, '[JsonProperty (ItemTypeNameHandling = TypeNameHandling.Auto)]' 'zu der Liste hinzuzufügen, und ich habe den' $ type' für die Generic List, aber nicht für die Controls innerhalb der List. – Targaryen