2017-04-19 4 views
2

ich eine einfache Klasse erstellt haben:C# JsonConvert wandelt ungültiges Objekt

public class TestObject 
{ 
    public TestObject(int id, string name, List<string> list) 
    { 
     this.Id = id; 

     if (name == null) 
     { 
      throw new ArgumentException(); 
     } 
     this.Name = name; 
     this.List = list; 
    } 

    [Required] 
    public int Id { get; } 

    public string Name { get; } 

    public List<string> List { get; } 
} 

Welche Ich mag würde deserialisieren und zu validieren, wenn orginal JSON richtig war:

[Test] 
public void MissingIdArgument() 
{ 
    var str = @"{ ""name"": ""aa"" } "; 
    Assert.Throws<JsonSerializationException>(() => 
     JsonConvert.DeserializeObject<TestObject>(
      str, 
      new JsonSerializerSettings() 
      { 
       CheckAdditionalContent = true, 
       DefaultValueHandling = DefaultValueHandling.Include, 
       MissingMemberHandling = MissingMemberHandling.Error, 
       NullValueHandling = NullValueHandling.Include, 

      })); 
} 

Ich würde diesen Test epxect passieren aber es tut es nicht. Es wird nicht geprüft, ob Id noch List Felder in orginal JSON vorhanden sind (obwohl das Feld Id erforderlich ist). Wenn Sie dem JSON eine zufällige Eigenschaft hinzufügen, werden tatsächlich Ausnahmen ausgelöst.

Wie man JsonConvert streng in einem Sinne macht, dass dieser Test (wie es ist) bestanden würde?

Um genau zu sein würde ich zu erwarten:

  • { id: 1, name: "aa" } - fail (weil keine Liste definiert ist)
  • { name: "aa", list: null } - fail (weil keine ID definiert ist)
  • { id: 0, name: "", list: null }-
passieren
+1

Wie wäre es mit einem [JSON-Schema] (http://www.newtonsoft.com/jsonschema) Regeln für Ihren JSON zu setzen? –

Antwort

2

Ich würde sagen, dass Sie die erforderliche Eigenschaft falsch angeben.

sollten Sie die JsonProperty attribute mit dem anstelle des Attributs RequiredRequired property verwenden.

Zum Beispiel:

public class TestObject 
{ 
    // Id has to be present in the JSON 
    [JsonProperty(Required = Required.Always)] 
    public int Id { get; } 

    // Name is optinional 
    [JsonProperty] 
    public string Name { get; } 

    // List has to be present in the JSON but may be null 
    [JsonProperty(Required = Required.AllowNull)] 
    public List<string> List { get; } 
} 

Die Required Eigenschaft kann von Newtonsoft.Json.Required enum auf eine Konstante eingestellt werden.

Überprüfen Sie die JsonPropertyAttribute class documentation für andere Konfigurationsmöglichkeiten.

Sie können auch die example in der offiziellen Dokumentation überprüfen.

+0

Obwohl die Lösung von Phill wahrscheinlich auch funktionierte, erfordert diese keine Änderungen in den Entarilisierern. Vielen Dank –

Verwandte Themen