NorCode
NorCode

Reputation: 689

How to generate Correct JSON Result in C# MVC

i am developing an MVC Application in C# and Want to Generate JSON Result Like:

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: []
                }]
            }]
        }]
    }]
};`

My JSON Function in C# :

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

My This C# function return strange output i don't know why..

{
"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
            }]
        }

Please Help me how to generate Correct JSON Format.

Upvotes: 2

Views: 1682

Answers (4)

rustem
rustem

Reputation: 153

This is happening because you're using your action method CalculateTreeView with recursion.

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

Which, in your case, returning a JsonResult instead of raw data to children array ( JsonResult includes parameters like ContentType, ContentEncoding, etc. into your object).

What you need is a helper method which returns and anonymous object. And generate your tree data with recursion inside that helper method.

You Action method: calling recursive helper method and returning JsonResult, which contains ContentType, ContentEncoding and other information about your data.

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

You Helper method: returning an anonymous object, raw data without ContentType, ContentEncoding, etc. :

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

UPDATE 1 :

and of course move your "code logic" into recursive helper method"

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

Upvotes: 1

C.Fasolin
C.Fasolin

Reputation: 319

you may generate a class that describe your result like this

JSON RESULT:

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

C# code

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

Upvotes: 1

D. Lucazeau
D. Lucazeau

Reputation: 66

Suppose you have (and you have to) a class named People like this :

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

I have removed 'data', it's normally another object.

Now you build your hierarchy of people and serialize p1 to json like this, I have removed the sid parameter.

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

And that does the trick (tested with something like http://localhost:50584/Home/CalculateTreeView).

Upvotes: 1

teo van kot
teo van kot

Reputation: 12491

In your case ContentEncoding, ContentType etc. This is fields that return Json() method. It happeneds becouse it's part of MVC JSON serialization of response and you don't need it.

What you should to to avoid it is create separate method that will return you anonymouse object (It should look like your controller methor but without JSON serialization) and than you should pass it to Json() function in your controller.

Upvotes: 1

Related Questions