2014-10-03 7 views
1

JSON의 JavaScript 개체가 원하는 C# 개체로 deserialize하지 않으면 어떻게 입력을 잘못했는지 설명하는 오류 메시지를 제공하도록 질문 할 수 있습니까? (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); 

을 이것은 모두 작동합니다. 날짜가 아닌 날짜가 생일로 전달되는 경우를 제외하고는 비 직렬화가 실패합니다.

"Dependent 2 생년월일이 유효한 날짜가 아닙니다."라는 오류 메시지를 제공하고 싶습니다. 또는 "부양 가족 2는 18 세 미만이어야합니다."

JSON이 내 객체로 직렬화되지 않는다면 JSON의 세부 정보를 어떻게 확인할 수 있습니까?

가능한 해결 방법 :

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

그리고 나는 문자열로 모든 것을 가진 오류를 얻을해야하고, 내가 할 수있는 객체를 통해 루프 내 검증을한다. 하지만 이것은 잘못된 것 같습니다.

+0

예외가 문제를 설명 할 수 있습니까? –

답변

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가 string으로 변경되었습니다. 그것은 틀린 느낌이지만, DateTime이 null 일 수없는 경우에도 null 가능하게 만듭니다. 그러나 나는 이것을 시험해 보았고 완벽하게 작동했을 것입니다. 감사! – scw