我需要将一些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中的其他一些开箱即用类有关吗?
答案 0 :(得分:0)
“开箱即用”的任何内容都不会调用非标准的addParam。最简单的事情是反序列化为“expando”对象(参见各种选项here),然后编写几行简单的C#来将事物从该对象移动到实际类型中。