将JSON反序列化为.NET对象,同时保留封装

时间:2013-08-04 19:31:30

标签: c# .net json deserialization

我需要将一些JSON反序列化为一个类。该类由一些简单的getter和setter组成,用于某些属性。其他属性是只读的,并通过该类的方法初始化。例如:

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并调用它的方法。这可能与DataContractJsonSerializer或.NET 3.5中的其他一些开箱即用类有关吗?

1 个答案:

答案 0 :(得分:0)

“开箱即用”的任何内容都不会调用非标准的addParam。最简单的事情是反序列化为“expando”对象(参见各种选项here),然后编写几行简单的C#来将事物从该对象移动到实际类型中。

相关问题