使用JSON.Net从我的类的实例中提取通用树结构

时间:2015-08-11 04:18:29

标签: c# json json.net

我正在为第三方软件创建一个加载项,该软件将数据从本机文件导出到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文档的对应类。

0 个答案:

没有答案