2013-08-04 2 views
1

클래스로 직렬화 해제해야하는 JSON이 있습니다. 이 클래스는 일부 속성에 대한 간단한 getter 및 setter로 구성됩니다. 다른 속성은 읽기 전용이며 해당 클래스의 메서드를 통해 초기화됩니다. 예 :캡슐화를 유지하면서 JSON을 .NET 객체에 비 직렬화

public class ReportDescription 
{ 
    public int Id { get; set; } 
    public int Title { get; set; } 
    public string Group { get; set; } 

    public IEnumerable<Param> RequiredParameters { get; } 
    public IEnumerable<Param> OptionalParameters { get; } 
    public void addParam(Param param) { /* add the param to the internal collection */} 
} 

RequiredParameters 속성은 IEnumerable을 반환하고 설정자가 없습니다. 이 객체에 필수 매개 변수를 추가하려면 addParam을 호출합니다.이 매개 변수는 비즈니스 로직을 수행하고 매개 변수를 객체 내부 컬렉션에 추가합니다.

내 JSON은 다음과 같습니다

[ 
    { 
     "ReportId": 1, 
     "DisplayName": "Report One", 
     "Group": "Group One", 
     "RequiredParameters": [], 
     "OptionalParameters": [], 
    }, 
    { 
     "ReportId": 2, 
     "DisplayName": "Report Two", 
     "Group": "Group Two", 
     "RequiredParameters": ["Param1", "Param2"], 
     "OptionalParameters": [], 
    } 
] 

어떻게 위에서 설명한 클래스에이 JSON을 역 직렬화 것인가?

getter 및 setter를 사용하여 속성에서 제대로 작동하는 DataContractJsonSerializer를 사용하려고했지만 JSON에서 RequiredParameters 속성을 발견했을 때 addParam을 호출하도록 사용자 정의 할 수있는 방법을 찾을 수 없었습니다. DataContractJsonSerializer 직렬화를 사용자 정의하는 간단한 방법이 있습니까?

또 다른 옵션은 JSON.NET을 사용하여 JSON을 탐색하고 수동으로 새 ReportDescription을 만들고 메서드를 호출하는 것입니다. DataContractJsonSerializer 또는 .NET 3.5의 상자 클래스에서 할 수 있습니까?

답변

0

"out of the box"는 비표준 addParam을 호출하지 않습니다. 가장 쉬운 일은 "expando"객체로 deserialize하고 (다양한 옵션 here 참조) 사물을 실제 유형으로 이동시키는 간단한 C# 몇 줄을 작성하는 것입니다.

관련 문제