C# 从表格层次数据构建json

C# 从表格层次数据构建json,c#,json,serialization,dynamic,expandoobject,C#,Json,Serialization,Dynamic,Expandoobject,假设我有一些数据,如下所示: { "Menu": { "aaa": "aaa", "bbb": { "ccc": "ccc", "ddd": "ddd" }, "eee": "eee" } } 我可以用如下关系方式将此类分层数据保存到数据库: http://i.stack.imgur.com/lmuq1.jpg KeyValuePair<string,

假设我有一些数据,如下所示:

{
    "Menu": {
        "aaa": "aaa",
        "bbb": {
             "ccc": "ccc",
             "ddd": "ddd"
        },
        "eee": "eee"
     }
}
我可以用如下关系方式将此类分层数据保存到数据库:

http://i.stack.imgur.com/lmuq1.jpg
KeyValuePair<string, List<Object>> bbb = new KeyValuePair<string, List<Object>>("bbb", new List<Object>());
bbb.Value.Add(new KeyValuePair<string, string>("ccc", "ccc"));
bbb.Value.Add(new KeyValuePair<string, string>("ddd", "ddd"));
toExport.Value.Add(bbb);
样本列表:

    List<MenuItem> menuItems = new List<MenuItem>();
    menuItems.Add(new MenuItem() { SiteMenuId = 1, ParentId = null, MenuName = "Menu", Url = null, SiteId = 1 });
    menuItems.Add(new MenuItem() { SiteMenuId = 2, ParentId = 1, MenuName = "aaa", Url = "aaa", SiteId = 1 });
    menuItems.Add(new MenuItem() { SiteMenuId = 3, ParentId = 1, MenuName = "bbb", Url = null, SiteId = 1 });
    menuItems.Add(new MenuItem() { SiteMenuId = 4, ParentId = 3, MenuName = "ccc", Url = "ccc", SiteId = 1 });
    menuItems.Add(new MenuItem() { SiteMenuId = 5, ParentId = 3, MenuName = "ddd", Url = "ddd", SiteId = 1 });
    menuItems.Add(new MenuItem() { SiteMenuId = 6, ParentId = 1, MenuName = "eee", Url = "eee", SiteId = 1 });
List menuItems=new List();
添加(new MenuItem(){SiteMenuId=1,ParentId=null,MenuName=“Menu”,Url=null,SiteId=1});
添加(新的MenuItem(){SiteMenuId=2,ParentId=1,MenuName=“aaa”,Url=“aaa”,SiteId=1});
添加(new MenuItem(){SiteMenuId=3,ParentId=1,MenuName=“bbb”,Url=null,SiteId=1});
添加(新的MenuItem(){SiteMenuId=4,ParentId=3,MenuName=“ccc”,Url=“ccc”,SiteId=1});
添加(new MenuItem(){SiteMenuId=5,ParentId=3,MenuName=“ddd”,Url=“ddd”,SiteId=1});
添加(new MenuItem(){SiteMenuId=6,ParentId=1,MenuName=“eee”,Url=“eee”,SiteId=1});
因此,当我从数据库中获取关系数据作为MenuItem对象的列表时,如何将其转换回json

public partial class MenuItem
{
    public int SiteMenuId { get; set; }
    public int SiteId { get; set; }
    public string MenuName { get; set; }
    public string Url { get; set; }
    public Nullable<int> ParentId { get; set; }
    public int CreatedUser { get; set; }
    public System.DateTime CreatedDate { get; set; }
    public Nullable<int> ModifiedUser { get; set; }
    public Nullable<System.DateTime> ModifiedDate { get; set; }
} 
公共部分类菜单项
{
public int SiteMenuId{get;set;}
public int SiteId{get;set;}
公共字符串菜单名{get;set;}
公共字符串Url{get;set;}
公共可为空的ParentId{get;set;}
public int CreatedUser{get;set;}
public System.DateTime CreatedDate{get;set;}
公共可为null的修饰符{get;set;}
公共可为空的ModifiedDate{get;set;}
} 

我必须使用字典或ExpandoObject之类的东西吗?我希望使用与开始时完全相同的格式。

如果可以使用NewtonSoft,请使用来反序列化JSON内容,并查看结果对象的外观。然后,创建一个与反序列化的结果结构匹配的类。逆向工程

使用此方法:

var obj = JsonConvert.DeserializeObject("{ "menu": { "aaa": "aaa"......} }");
让我知道您的发现。

您可以为此创建对象:

KeyValuePair<string, List<Object>> toExport = new KeyValuePair<int, int>("Menu", new List<Object>());
当您打算添加新的
元素时,可以这样做:

toExport.Value.Add(new KeyValuePair<string, string>("aaa", "aaa"));
DynamicKeyValueBuilder myBuilder = new DynamicKeyValueBuilder("Menu");
myBuilder.Add(new List<string>(new string[] {"Menu"}), "aaa", "aaa");
myBuilder.Add(new List<string>(new string[] {"Menu"}), "bbb", null);
myBuilder.Add(new List<string>(new string[] {"Menu", "bbb"}), "ccc", "ccc");
添加(新列表(新字符串[]{“菜单”}),“aaa”,“aaa”); 当您打算添加新的
元素时,可以这样做:

toExport.Value.Add(new KeyValuePair<string, string>("aaa", "aaa"));
DynamicKeyValueBuilder myBuilder = new DynamicKeyValueBuilder("Menu");
myBuilder.Add(new List<string>(new string[] {"Menu"}), "aaa", "aaa");
myBuilder.Add(new List<string>(new string[] {"Menu"}), "bbb", null);
myBuilder.Add(new List<string>(new string[] {"Menu", "bbb"}), "ccc", "ccc");
myBuilder.Add(新列表(新字符串[]{“菜单”}),“bbb”,null);
当您打算在内部列表中添加某些内容时,可以这样做:

toExport.Value.Add(new KeyValuePair<string, string>("aaa", "aaa"));
DynamicKeyValueBuilder myBuilder = new DynamicKeyValueBuilder("Menu");
myBuilder.Add(new List<string>(new string[] {"Menu"}), "aaa", "aaa");
myBuilder.Add(new List<string>(new string[] {"Menu"}), "bbb", null);
myBuilder.Add(new List<string>(new string[] {"Menu", "bbb"}), "ccc", "ccc");
myBuilder.Add(新列表(新字符串[]{“Menu”,“bbb”}),“ccc”,“ccc”);
使用,我们可以编写一个自定义转换器,从
菜单项列表中生成所需的json

注意:我省略了转换器的reader部分以使其简洁(因为它实际上与问题无关),但逻辑与writer部分类似

然后简单地像这样使用它:

        var menuItems = new MenuItemCollection();
        menuItems.Add(new MenuItem() { SiteMenuId = 1, ParentId = null, MenuName = "Menu", Url = null, SiteId = 1 });
        menuItems.Add(new MenuItem() { SiteMenuId = 2, ParentId = 1, MenuName = "aaa", Url = "aaa", SiteId = 1 });
        menuItems.Add(new MenuItem() { SiteMenuId = 3, ParentId = 1, MenuName = "bbb", Url = null, SiteId = 1 });
        menuItems.Add(new MenuItem() { SiteMenuId = 4, ParentId = 3, MenuName = "ccc", Url = "ccc", SiteId = 1 });
        menuItems.Add(new MenuItem() { SiteMenuId = 5, ParentId = 3, MenuName = "ddd", Url = "ddd", SiteId = 1 });
        menuItems.Add(new MenuItem() { SiteMenuId = 6, ParentId = 1, MenuName = "eee", Url = "eee", SiteId = 1 });

        var json = JsonConvert.SerializeObject(menuItems,Formatting.Indented);

查找newtonsoft,以及如何序列化为json。谢谢,我将了解newtonsoft。但我希望我的json与第一种格式相同。实际上,这就是我要问的。我通常使用Automapper在通过http公开的模型和dto之间进行转换。你看过@BrianRogers了吗?是的,但我不想在json格式中有children:[]属性。我需要与问题中解释的格式完全相同。谢谢,看来KeyValuePair对象会对我有所帮助。但我的主要问题是如何使用动态数据构建适当的对象。想想json中的项目数量,它们的深度会有所不同。@anilca,我已经编辑了我的答案。代码未经测试,如果您发现问题,请告诉我。实际上我不知道如何使用您的生成器。我在问题中添加了项目的示例列表。如果您有示例列表,那么如何使用它创建我期望的json?如果我有两个根元素,而不是示例中的“Menu”呢?我相信您的问题是您没有成功地构建预期为path的列表。你有一个ParentId可以帮助你完成任务。例如,5的父项是3,3的父项是1,1的父项是null,因此1是根。例如,可以使用ParentId关系构建树。最初并没有提到多个根,但您可以使用List来实现这一目的,或者您也可以使用List导出一个List并稍微修改searchParent。但我的json不会每次都相同。想想json中的项目数量,它们的深度会有所不同