【问题标题】:How to generate Correct JSON Result in C# MVC如何在 C# MVC 中生成正确的 JSON 结果
【发布时间】:2015-10-02 07:11:31
【问题描述】:

我正在用 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: []
                }]
            }]
        }]
    }]
};`

我在 C# 中的 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 格式。

【问题讨论】:

标签: c# json asp.net-mvc asp.net-mvc-4 c#-4.0


【解决方案1】:

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

你应该避免它是创建一个单独的方法,它将返回你的匿名对象(它应该看起来像你的控制器方法,但 没有 JSON 序列化)而不是你应该将它传递给控制器​​中的Json() 函数。

【讨论】:

    【解决方案2】:

    假设你有(而且你必须)这样一个名为 People 的类:

    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 之类的东西进行了测试)。

    【讨论】:

      【解决方案3】:

      你可以生成一个这样描述你的结果的类

      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);
      

      【讨论】:

        【解决方案4】:

        发生这种情况是因为您正在使用带有递归的操作方法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 等参数到您的对象中)。

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

        你的Action方法:调用递归辅助方法并返回JsonResult,其中包含了你的数据的ContentType、ContentEncoding等信息。

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

        You 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[] { } };
        }
        

        【讨论】:

        • 不错的答案 :) rustem
        猜你喜欢
        • 2017-03-03
        • 2022-11-21
        • 2020-06-20
        • 1970-01-01
        • 2020-10-25
        • 2015-08-16
        • 2021-04-04
        • 2022-01-26
        • 2018-08-08
        相关资源
        最近更新 更多