2013-08-04 63 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并且没有setter。要将必需的参数添加到此对象中,您可以调用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这将上述类?

我试图使用DataContractJsonSerializer,它对于带有getter和setter的属性很好,但无法找到一种方法来定制它,以便在JSON中遇到RequiredParameters属性时调用addParam。有没有一种直接定制DataContractJsonSerializer序列化的方法?

我考虑过的另一个选择是使用JSON.NET来浏览JSON并手动创建一个新的ReportDescription并调用它的方法。这可能与.NET 3.5中的DataContractJsonSerializer或其他一些开箱即用的类有关吗?

回答

0

没有“开箱即用”将打电话给您的非标准addParam。最简单的事情就是反序列化为一个“expando”对象(参见各种选项here),然后编写几行简单的C#将事物从该对象移动到实际类型中。