2015-10-02 17 views
3

我在C#开发一个MVC应用程序,并希望生成JSON结果一样:在C#如何在C#MVC生成正确的JSON结果

var json = { 
    id: "1", 
    name: "Ram | 1", 
    data: {}, 
    children: [{ 
     id: "2", 
     name: "Hari | 2", 
     data: {}, 
     children: [{ 
      id: "Sam3", 
      name: "2.4", 
      data: {}, 
      children: [] 
     }, { 
      id: "4", 
      name: "Jon | 4", 
      data: {}, 
      children: [{ 
       id: "5", 
       name: "Smith | 5", 
       data: {}, 
       children: [{ 
        id: "6", 
        name: "Max | 6", 
        data: {}, 
        children: [] 
       }] 
      }] 
     }] 
    }, { 
     id: "7", 
     name: "Himanshu | 7", 
     data: {}, 
     children: [{ 
      id: "8", 
      name: "Jack | 8", 
      data: {}, 
      children: [{ 
       id: "9", 
       name: "Mad | 9", 
       data: {}, 
       children: [{ 
        id: "10", 
        name: "Jacky | 10", 
        data: {}, 
        children: [] 
       }, { 
        id: "11", 
        name: "Anchor | 11", 
        data: {}, 
        children: [] 
       }] 
      }, { 
       id: "12", 
       name: "Dam | 12", 
       data: {}, 
       children: [{ 
        id: "13", 
        name: "Xyz | 13", 
        data: {}, 
        children: [] 
       }] 
      }, { 
       id: "14", 
       name: "History | 14", 
       data: {}, 
       children: [{ 
        id: "15", 
        name: "java | 15", 
        data: {}, 
        children: [] 
       }, { 
        id: "16", 
        name: "Blue | 16", 
        data: {}, 
        children: [] 
       }, { 
        id: "17", 
        name: "Kali | 17", 
        data: {}, 
        children: [] 
       }, { 
        id: "18", 
        name: "lon | 18", 
        data: {}, 
        children: [] 
       }] 
      }] 
     }] 
    }] 
};` 

我的JSON功能:

[HttpPost] 
    public JsonResult CalculateTreeView(int sid) 
    { 
     /* 
      Some Code Logic 
     */ 
     if (res != null) 
      if (res.l_id != 0) 
       return Json(new { id = res.id, name = res.name + " | " + res.id, data = new { }, children = new object[] { CalculateTreeView(res.l_id) } }); 
      else 
       return Json(new { id = res.id, name = res.name + " | " + res.id, data = new { }, children = new object[] { } }); 
     else 
      return Json(new { id = res.id, name = res.name + " | " + res.id, data = new { }, children = new object[] { } }); 
    } 

我这C#函数返回奇怪的输出我不知道为什么..

{ 
"id":1, 
"name":"anant | 1", 
"data":{}, 
"children":[{ 
     "ContentEncoding":null, 
     "ContentType":null, 
     "Data":{ 
      "id":2, 
      "name":"Samir | 2", 
      "data":{}, 
      "children":[{ 
        "ContentEncoding":null, 
        "ContentType":null, 
        "Data":{ 
         "id":4, 
         "name":"fjyfyj | 4", 
         "data":{}, 
         "children":[{ 
           "ContentEncoding":null, 
           "ContentType":null, 
           "Data":{ 
            "id":8, 
            "name":"cdasdasd | 8", 
            "data":{}, 
            "children":[] 
            }, 
           "JsonRequestBehavior":1, 
           "MaxJsonLength":null, 
           "RecursionLimit":null 
           }] 
          }, 
         "JsonRequestBehavior":1, 
         "MaxJsonLength":null, 
         "RecursionLimit":null 
         }] 
        }, 
        "JsonRequestBehavior":1, 
        "MaxJsonLength":null, 
        "RecursionLimit":null 
      }] 
     } 

请帮助我如何生成正确的JSON格式。

+0

请发帖'CalculateTreeView'方法体 – nomail

+0

你必须序列化你的对象:http://stackoverflow.com/questions/5300855/how-can-my-asp-net-c-sharp-class-return-a-json -format –

回答

1

在你的情况下ContentEncodingContentType等这是返回Json()方法的字段。它发生了,因为它是MVC JSON序列化响应的一部分,您不需要它。

你应该要避免它是建立独立的方法将返回anonymouse对象(它应该看起来像你的控制器methor但没有JSON序列)和比你应该把它传递给Json()功能控制器。

1

假设你有(你必须)评选的人一类是这样的:

public class People { 
    public int Id { get; set; } 
    private string _name; 

    public string Name { 
     get { return _name + " | " + Id; } 
     set { _name = value; } 
    } 

    public List<People> Children { get; set; } 

    public People() { 
     Children = new List<People>(); 
    } 
} 

我已删除“数据”,它通常是另一个对象。

现在,您构建了人员层次结构并将p1序列化为json,我已经移除了sid参数。

public JsonResult CalculateTreeView() { 

     var p1 = new People 
     { 
      Id = 1, 
      Name = "Ram" 
     }; 
     var p2 = new People 
     { 
      Id = 2, 
      Name = "Hari" 
     }; 
     var p3 = new People 
     { 
      Id = 3, 
      Name = "Sam3" 
     }; 
     var p4 = new People 
     { 
      Id = 4, 
      Name = "Jon" 
     }; 
     var p5 = new People 
     { 
      Id = 5, 
      Name = "Smith" 
     }; 
     var p6 = new People 
     { 
      Id = 6, 
      Name = "Max" 
     }; 
     var p7 = new People 
     { 
      Id = 7, 
      Name = "Himanshu" 
     }; 
     var p8 = new People 
     { 
      Id = 8, 
      Name = "Jack" 
     }; 
     var p9 = new People 
     { 
      Id = 9, 
      Name = "Mad" 
     }; 
     var p10 = new People 
     { 
      Id = 10, 
      Name = "Jacky" 
     }; 
     var p11 = new People 
     { 
      Id = 11, 
      Name = "Anchor" 
     }; 
     var p12 = new People 
     { 
      Id = 12, 
      Name = "Dam" 
     }; 
     var p13 = new People 
     { 
      Id = 13, 
      Name = "Xyz" 
     }; 
     var p14 = new People 
     { 
      Id = 14, 
      Name = "History" 
     }; 
     var p15 = new People 
     { 
      Id = 15, 
      Name = "Java" 
     }; 
     var p16 = new People 
     { 
      Id = 16, 
      Name = "Blue" 
     }; 
     var p17 = new People 
     { 
      Id = 17, 
      Name = "Kali" 
     }; 
     var p18 = new People 
     { 
      Id = 18, 
      Name = "lon " 
     }; 

     p14.Children.Add(p15); 
     p14.Children.Add(p16); 
     p14.Children.Add(p17); 
     p14.Children.Add(p18); 

     p12.Children.Add(p13); 

     p9.Children.Add(p10); 
     p9.Children.Add(p11); 

     p8.Children.Add(p9); 
     p8.Children.Add(p12); 
     p8.Children.Add(p14); 

     p7.Children.Add(p8); 

     p5.Children.Add(p6); 

     p4.Children.Add(p5); 

     p2.Children.Add(p3); 
     p2.Children.Add(p4); 

     p1.Children.Add(p2); 
     p1.Children.Add(p7); 


     return Json(p1, JsonRequestBehavior.AllowGet); 
    } 

而这样做的窍门(测试类似http://localhost:50584/Home/CalculateTreeView)。

1

您可以生成这样描述

JSON结果你的结果类:

{"Name":"Bob","PeopleList":[{"Name":"Tom","PeopleList":[]}]} 

C#代码

public class People 
{ 
public string Name { get; set; } 
public ICollection<People> PeopleList { get; set; } 
public People() 
{ 
PeopleList = new List<People>(); 
} 
} 

People people = new People(){Name = "Bob"}; 
people.PeopleList.Add(new People() { Name = "Tom" }); 
var s= Newtonsoft.Json.JsonConvert.SerializeObject(people); 
1

发生这种情况,因为您使用的操作方法CalculateTreeView与递归。

[HttpPost] 
public JsonResult CalculateTreeView(int sid) 
{ 
/*some code */ 
    return Json(new { id = res.id, name = res.name + " | " + res.id, data = new {}, children = new object[] { CalculateTreeView(res.l_id) } }); 
} 

其中,在你的情况下,返回JsonResult代替原始数据以儿童阵列(JsonResult包括像的ContentType,ContentEncoding等参数插入对象)。

你需要的是一个辅助方法,它返回匿名对象。并使用该辅助方法中的递归生成树数据。

您操作方法:调用递归辅助方法并返回JsonResult,其中包含ContentType,ContentEncoding和其他有关您的数据的信息。

[HttpPost] 
public JsonResult CalculateTreeView(int sid) 
{ 
    return Json(new { json = GenerateTreeViewData(res.l_id) }); 
} 

您Helper方法:返回一个匿名对象,原始数据不ContentType的,ContentEncoding等:

private object GenerateTreeViewData(int sid) 
{ 
    if (res != null) 
     if (res.l_id != 0) 
      return new { id = res.id, name = res.name + " | " + res.id, data = new { }, children = new object[] { GenerateTreeViewData(res.l_id) } }; 
     else 
      return new { id = res.id, name = res.name + " | " + res.id, data = new { }, children = new object[] { } }; 
    else 
     return new { id = res.id, name = res.name + " | " + res.id, data = new { }, children = new object[] { } }; 
} 

更新1:

,当然移动你的“代码逻辑“转换为递归辅助方法”

private object GenerateTreeViewData(int sid) 
{ 
    /* 
     Some Code Logic 
    */ 

    if (res != null) 
     if (res.l_id != 0) 
      return new { id = res.id, name = res.name + " | " + res.id, data = new { }, children = new object[] { GenerateTreeViewData(res.l_id) } }; 
     else 
      return new { id = res.id, name = res.name + " | " + res.id, data = new { }, children = new object[] { } }; 
    else 
     return new { id = res.id, name = res.name + " | " + res.id, data = new { }, children = new object[] { } }; 
} 
+0

好的回答:) rustem –