How to build object hierarchy for serialization with json.net?

后端 未结 3 777
醉梦人生
醉梦人生 2020-12-24 02:30

I\'m trying to properly write code to build a data structure to serialize into json.

I\'m using json.net.

I don\'t want to create a bunch of classes to hold

3条回答
  •  情歌与酒
    2020-12-24 03:01

    I think what you're asking is how to serialize complex business objects in json, but only expose certain properties.

    In other words you already have a list of students, but you only want to send very specific data via json. If I'm wrong this answer won't suit your needs.

    So assuming you have a list of students, with a projects property that has an inner property of tasks, this is how I do it without having to create loads of new classes, I use anonymous objects.

    Once I've created my list of anonymous objects, I simply turn them into a json string.

    As pointed out in the comments you don't need to use json.net, this functionality is available in the framework, add a reference to System.Web.Extensions.dll then

    using System.Web.Script.Serialization;

    var jsonStudents = new List();
    
    foreach (var student in students)
    {
        jsonStudents.Add(new
        {
            student.Id,         //anonymous properties automatically pick up the name of the property you pass them, this will be called Id
            FullName = student.FirstName + " " + student.LastName, //if you want to name a property yourself use this notation
            Projects = student.Projects.Select(p => new //this will be an enumerable of nested anonymous objects, we're partially selecting project properties
            {
                p.Id,
                p.Name,
                Tasks = p.Tasks.Select(t => new //nesting another level
                {
                    t.Id,
                    t.Name
                })
            })
        });
    }
    
    var serializer = new JavaScriptSerializer();
    
    var jsonString = serializer.Serialize(jsonStudents);
    
    
    

    If you really want to use loops you can do this to allow you to do more complicated things in the creating of the projects and tasks:

    var jsonStudents = new List();
    
    foreach (var student in students)
    {
        var tempStudent = new
        {
            student.Id,         //anonymous properties automatically pick up the name of the property you pass them, this will be called Id
            FullName = student.FirstName + " " + student.LastName, //if you want to name a property yourself use this notation
            Projects = new List()
        };
    
        foreach (var project in student.Projects)
        {
            var tempProject = new {
                project.Id,
                project.Name,
                Tasks = new List()
            };
    
            foreach (var task in project.Tasks)
            {
                tempProject.Tasks.Add(new {
                    task.Id,
                    task.Name
                });
            }
    
            tempStudent.Projects.Add(tempProject);
        }
    
        jsonStudents.Add(tempStudent);
    }
    
    var serializer = new JavaScriptSerializer();
    
    var jsonString = serializer.Serialize(jsonStudents);
    
        

    提交回复
    热议问题