生成类别树结构json数据?

分类表:

ID => int,主键

CategoryName => varchar

ParentCategoryID => int,nullable

生成以下json数据格式:

[{ "id":1, "name":"Root", "Edit":"edit.png", "Delete":"delete.png", "children":[{ "id":2, "name":"Horoscope", "Edit":"edit.png", "Delete":"delete.png", "children":[{ "id":21, "name":"Daily", "Edit":"edit.png", "Delete":"delete.png", "children":[{ "id":211, "name":"Aries", "Edit":"edit.png", "Delete":"delete.png" },{ "id":212, "name":"Taurus", "Edit":"edit.png", "Delete":"delete.png" }] },{ "id":22, "name":"Weekly", "Edit":"edit.png", "Delete":"delete.png", "children":[{ "id":221, "name":"Gemini", "Edit":"edit.png", "Delete":"delete.png" },{ "id":222, "name":"Aries", "Edit":"edit.png", "Delete":"delete.png" },{ "id":223, "name":"Taurus", "Edit":"edit.png", "Delete":"delete.png" }] }] },{ "id":3, "name":"News", "Edit":"edit.png", "Delete":"delete.png", "children":[{ "id":31, "name":"Sports", "Edit":"edit.png", "Delete":"delete.png" },{ "id":32, "name":"Interantional", "Edit":"edit.png", "Delete":"delete.png" },{ "id":33, "name":"Entertaintment", "Edit":"edit.png", "Delete":"delete.png" }] }] }] 

我有Jquery TreeGrid插件,需要上面的json格式。 如何从数据库的类别表生成上面的json数据并在控制器操作中返回json数据。 我有使用entity framework的模型。

我不打算混合数据和UI指令开始! 它使用冗余重复数据使JSON消息混乱。 我认为由客户决定将数据放在何处以及如何显示数据,或者您应该单独发送这些指令(例如,作为消息的第一部分)。

也就是说,完成这项工作的最简单方法是让你的类定义如下:

 class Category { public int Id { get; set; } public string CategoryName { get; set; } public int? ParentCategoryID { get; set; } [ForeignKey("ParentCategoryID")] public virtual ICollection SubCategories { get; set; } } 

当您使用ParentCategoryID == null查询Categories ,启用延迟加载并序列化为JSON时,您将看到包含所有级别,因为对于每个Category将发出查询以获取其子级。

请注意, Category没有ParentCategory属性,因为这可能导致JSON序列化因循环引用而失败。

对于序列化,如果您不在MVC API控制器中,则可以使用JavaScriptSerializer

BTW。 执行此操作的最佳方法是保留域模型transport-ignorant并使用CategoryDto对象的结构。

我想你需要在你的域类中有一个名为“Children”的属性,如下所示,

 Category { public int Id{get;set;} public string CategoryName{get;set;} public int ParentCategoryID {get;set;} public Category ParentCategory {get;set;} public virtual IList Children{get;set;} } 

然后你可以使用像AutoMapper这样的映射器将这些模型映射到你的视图模型(它具有json对象所需的属性)