我正在为第三方软件创建一个加载项,该软件将数据从本机文件导出到JSON。为此,我开发了一系列C#.NET类,它们代表了我想要导出的数据。我的工具从软件中的数据生成这些类的实例,然后使用JSON.NET将这些实例序列化为JSON。
例如,我可能会有以下类......
public class Document
{
public string FileName {get; set;}
public string FileSize {get; set;}
public List<Bar> Bars {get; set;}
}
public class Bar
{
public string Name {get; set;}
public List<Bar> SubBars {get; set;}
}
..序列化为......
{
"FileName": "foobar.abc",
"FileSize": 12345,
"Bars": [
{
"Name": "Bar 1",
"SubBars": []
},
{
"Name": "Bar 2",
"SubBars": [
{
"Name": "Bar 2a",
"SubBars": []
},
{
"Name": "Bar 2b",
"SubBars": []
}
]
}
]
}
一切正常。但是,我还想在树控件中显示导出的数据层次结构,因此需要一种通用的方法来获取&#34; children&#34;我的任何课程。
我的第一个想法是为我的所有类创建一个接口,它将返回一个值字典。
public interface IItem
{
public IDictionary<string, object> GetValues();
}
此实现可能如下所示..
public class Document:IItem
{
public string FileName {get; set;}
public string FileSize {get; set;}
public List<Bar> Bars {get; set;}
public IDictionary<string, object> GetValues()
{
var dict = new Dictionary<string,object>();
dict.Add("FileName", FileName);
dict.Add("FileSize ", FileSize);
dict.Add("Bars", Bars);
return dict;
}
}
如果我添加,删除或重命名我的类的属性,这将更新繁琐。或者,我可以创建此接口的默认实现,它使用反射来返回类的属性。
public class Item:IItem
{
public IDictionary<string, object> GetValues()
{
var dict = new Dictionary<string,object>();
//Code that adds all properties to the dictionary
//through reflection goes here....
return dict;
}
}
然而,这复制了已经内置到JSON.Net中的反射逻辑,并且很可能会变得比我想要的更复杂。例如,如果我将[JsonIgnore]属性添加到我的类的属性,我需要考虑到这一点。如果没有将这些值保存到JSON中,我不希望这些值显示在我的树控件中。
我是否可以通过某种方式使用JSON.Net从我的类实例或序列化JSON中确定相同的通用树结构?我在之前的项目中使用过XML和System.Xml.XmlDocument
类,但它似乎不是JSON.Net中的一个代表通用JSON文档的对应类。