2017-04-19 100 views
2

我創建了一個簡單的類:C#JsonConvert轉換無效的對象

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; } 
} 

,我想反序列化和驗證,如果原單JSON是正確的:

[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, 

      })); 
} 

我會epxect這個測試通過但是它沒有。它不檢查在原始JSON中是否存在IdList字段(儘管Id字段是必需的)。向JSON添加一些隨機屬性會導致實際拋出異常。

如何使JsonConvert在某種意義上是嚴格的,即測試(因爲它)會通過?

確切的說我會希望:

  • { id: 1, name: "aa" } - 失敗(因爲沒有列表定義)
  • { name: "aa", list: null } - 失敗(因爲沒有ID被定義)
  • { id: 0, name: "", list: null } - 通過
+1

如何使用[json schema](http://www.newtonsoft.com/jsonschema)設置關於您的json的規則? –

回答

2

我想說,你是以錯誤的方式指定所需的屬性。

您應該使用JsonProperty attributeRequired property而不是Required屬性。

例如:

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; } 
} 

Required屬性可以從Newtonsoft.Json.Required enum被設定爲一個常數。

檢查JsonPropertyAttribute class documentation的其他配置可能性。

您還可以在官方文檔中檢查example

+0

雖然Phill的解決方案可能也會起作用,但這不需要對解析器進行任何更改。謝謝 –