2017-04-14 6 views
1

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?

+0

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 ... –

+0

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

+0

@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

Antwort

1

Anstatt die globalen Einstellungen von Ihrem Framework verwendet ändern, können Sie [JsonProperty(ItemTypeNameHandling = TypeNameHandling.All)] auf Ihre public IList<Control> Controls { get; set; } Eigenschaft in den Typinformationen zu zwingen, für jedes Element in der Liste emittiert werden:

public class Page 
{ 
    public Guid Id { get; set; } 
    public Guid CustomerId { get; set; } 
    [JsonProperty(ItemTypeNameHandling = TypeNameHandling.All)] 
    public IList<Control> Controls { get; set; } 
} 

Probe fiddle.

Sie könnten die Typinformationen mithilfe eines benutzerdefinierten Serialisierungsbinders bereinigen, und zwar aus Gründen, die erläutert wurden here.

Verwandte Themen