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

本文关键字:保留 封装 对象 JSON 反序列化 NET | 更新日期: 2023-09-27 18:26:33

我有一些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中的其他开箱即用类有关吗?

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

没有什么"开箱即用"会调用非标准的addParam。最简单的方法是反序列化为一个"expando"对象(请参阅此处的各种选项),然后编写几行琐碎的C#,将内容从该对象移动到实际类型中。