【问题标题】:Deserializing JSON to a .NET object while preserving encapsulation将 JSON 反序列化为 .NET 对象,同时保留封装
【发布时间】:2013-08-04 19:31:30
【问题描述】:

我有一些 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 并且没有设置器。要将所需参数添加到此对象,您将调用 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 中的其他开箱即用类有关吗?

【问题讨论】:

    标签: c# .net json deserialization


    【解决方案1】:

    没有什么“开箱即用”会调用您的非标准 addParam。最简单的方法是反序列化为“expando”对象(请参阅各种选项here),然后编写几行简单的 C# 代码来将该对象中的内容转换为您的实际类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-28
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多