2014-10-03 55 views
1

如果JSON中的JavaScript對象不會反序列化到我想要的C#對象,我該如何詢問它以提供解釋輸入錯誤的錯誤消息? (假設JSON格式是正確的,只是數據是無效的。)在反序列化爲C#對象之前驗證JSON

我的C#類:(簡體)

public class Dependent 
{ 
    public Dependent() 
    { 
    } 
    public string FirstName { get; set; } 
    public DateTime DateOfBirth { get; set; } 
} 

測試代碼進行反序列化:

string dependents = @"[ 
          { 
           ""FirstName"": ""Kenneth"", 
           ""DateOfBirth"": ""02-08-2013"" 
          }, 
          { 
           ""FirstName"": ""Ronald"", 
           ""DateOfBirth"": ""08-07-2011"" 
          } 
         ]"; 

JavaScriptSerializer jss = new JavaScriptSerializer(); 

List<Dependent> deps = new List<Dependent>(); 
deps = jss.Deserialize<List<Dependent>>(dependents); 

這一切都有效。除非傳入非日期作爲生日,否則將無法反序列化。

我想提供一個錯誤消息,如「依賴2出生日期不是有效日期」。或「受撫養人2必須在18歲以下」。

如何驗證JSON的細節,如果它不會反序列化到我的對象?

可能的解決辦法:

public class SerializableDependent 
{ 
    public SerializableDependent() 
    { 
    } 
    public string FirstName { get; set; } 
    public string DateOfBirth { get; set; } 
} 

然後,我不應該擁有一切作爲一個字符串的任何錯誤,我可以通過對象循環和做我的驗證。這似乎是錯誤的。

+0

不例外解釋這個問題? – 2014-10-03 21:44:45

回答

2

JavaScriptSerializer不支持廣泛的錯誤處理。我建議你使用Json.NET library。您可以使用JsonSerializerSettings對象的Error事件處理程序來捕獲有關出錯的更多詳細信息。有關使用此會員的信息在documentation中。

爲了您上面的代碼片段,其中填充錯誤消息的數組可以如下寫的處理程序:

public class Dependent 
{ 
    public Dependent() 
    { 
    } 
    public string FirstName { get; set; } 
    public DateTime? DateOfBirth { get; set; } // Use a nullable object to hold the error value 
} 

void DeserializeTest() 
{ 
    string dependents = @"[ 
          { 
           ""FirstName"": ""Kenneth"", 
           ""DateOfBirth"": ""02-08-2013"" 
          }, 
          { 
           ""FirstName"": ""Ronald"", 
           ""DateOfBirth"": ""asdf"" 
          } 
         ]"; 

    var messages = new List<string>(); 

    var settings = new JsonSerializerSettings(){ 
     Error = (s,e)=>{ 
      var depObj = e.CurrentObject as Dependent; 
      if(depObj != null) 
      { 
       messages.Add(string.Format("Obj:{0} Message:{1}",depObj.FirstName, e.ErrorContext.Error.Message)); 
      } 
      else 
      { 
       messages.Add(e.ErrorContext.Error.Message); 
      } 
      e.ErrorContext.Handled = true; // Set the datetime to a default value if not Nullable 
     } 
    }; 
    var ndeps = JsonConvert.DeserializeObject<Dependent[]>(dependents, settings); 
    //ndeps contains the serialized objects, messages contains the errors 
} 
+0

我最終將DateOfBirth更改爲字符串。它感覺不對,但是如果DateTime不能爲空,它也是可以爲空的。但我確實嘗試過,並且能夠完美運作。謝謝! – scw 2014-10-07 21:11:50