2016-04-19 3 views
1

Ich verwende NJsonSchema v2.6 für das JSON-Schema für die folgende Klasse zu erzeugen:Wie kann sichergestellt werden, dass NJsonSchema nur die erforderlichen Felder enthält?

[DataContract(Name = "Message", Namespace = "")] 
public class AMessageModel 
{ 
    [DataMember] 
    internal Guid MessageId { get; set; } 

    internal DateTime MessageDate { get; set; } 
} 

[DataContract(Name = "Message", Namespace = "")] 
public class AddUserMessage : AMessageModel 
{ 
    [DataMember] 
    public string AccountName { get; set; } 

    [DataMember] 
    public string FistName { get; set; } 

    [Range(2, 5)] 
    [DataMember] 
    public string LastName { get; set; } 

    [DataMember] 
    public string Email { get; set; } 

    [DataMember] 
    public string Password { get; set; } 
} 

Das erzeugte JSON Schema:

 { 
      "$schema": "http://json-schema.org/draft-04/schema#", 
      "type": "object", 
      "typeName": "AddFitnessHubAccountMessage", 
      "additionalProperties": false, 
      "properties": { 
      "AccountName": { 
       "type": [ 
       "null", 
       "string" 
       ] 
      }, 
      "FistName": { 
       "type": [ 
       "null", 
       "string" 
       ] 
      }, 
      "LastName": { 
       "type": [ 
       "null", 
       "string" 
       ] 
      }, 
      "Email": { 
       "type": [ 
       "null", 
       "string" 
       ] 
      }, 
      "Password": { 
       "type": [ 
       "null", 
       "string" 
       ] 
      } 
      }, 
      "allOf": [ 
      { 
       "type": "object", 
       "typeName": "AMessageModel", 
       "additionalProperties": false, 
       "properties": { 
       "MessageId": { 
        "type": "string", 
        "format": "guid" 
       }, 
       "MessageDate": { 
        "type": "string", 
        "format": "date-time" 
       } 
       } 
      } 
      ] 
     } 

Auch wenn die MessageDate Eigenschaft nicht als Datamember markiert , es ist immer im Schema enthält, auch das generierte Schema enthält zwei Pfade Schema, wenn es nur einen umfassen soll, so scheint es, dass der Parser nicht die Eigenschaften flacht.

UPDATE

dies das Problem mit mehreren Schema Pfade fixiert werden

erstellt
new JsonSchemaGeneratorSettings 
{ 
    FlattenInheritanceHierarchy = true 
} 

GitHub Ausgabe: https://github.com/NJsonSchema/NJsonSchema/issues/53

+0

Dies ist ein Fehler in der aktuellen Implementierung ... Ill fix, dass bald –

Antwort

2

Ich bin der Autor der Bibliothek NJsonSchema.

Ignoriert Eigenschaften

ein Fehler in der Bibliothek und jetzt (v2.7 +) Eigenschaft ignorieren Werke Es war wie folgt:

Eine Eigenschaft wird ignoriert, wenn entweder

  1. Das Anwesen ist mit der JsonIgnoreAttribute Eigenschaft markiert
  2. die Klasse hat eine DataContractAttribute Attri hat bute und die Eigenschaft hat keine DataMemberAttribute und keine JsonPropertyAttribute

https://github.com/NJsonSchema/NJsonSchema/wiki/JsonSchemaGenerator

Vererbungshierarchie Flatten

Wie Sie bereits herausgefunden, können Sie die Vererbungshierarchie über die FlattenInheritanceHierarchy Einstellung abflachen kann ..

. die Bibliothek wird in erster Linie für die Codeerzeugung verwendet, und somit die inheritanc e wird normalerweise benötigt.

+0

Ich werde es später versuchen. Vielen Dank für die schnelle Lösung :) – Marco

1

Da NJsonSchema eine Abhängigkeit von Newtonsoft.Json hat, haben Sie versucht, diese aus der Newtonsoft.Json Dokumentation?

Conditional Property Serialization

Um bedingt eine Eigenschaft serialisiert werden, fügen Sie eine Methode, die boolean mit dem gleichen Namen wie die Eigenschaft gibt und dann mit ShouldSerialize die Methode Namen voranstellen. Das Ergebnis der Methode bestimmt, ob die Eigenschaft serialisiert ist. Wenn die Methode true zurückgibt, dann wird die Eigenschaft serialisiert werden, wenn es falsch kehrt dann Eigentum übersprungen.

+0

Es ist ein gutes, aber das hat es nicht behoben. Newtonsoft.Json arbeitet auch mit DataContracts, aber ich habe es noch einmal versucht und das Ergebnis ist das gleiche. Vielleicht müssen sie nur einen Typ scannen und alle Eigenschaften mit angeben ... Danke trotzdem :) – Marco

+0

Die JSON-Schema-Generierung ist eigentlich kein Serialisierungsprozess und somit nicht in Json.NET sondern in NJsonSchema implementiert. Der Prozess verwendet nur Reflektion, um das JSON-Schema aufzubauen ... –

Verwandte Themen