如何使用 json.net 生成序列化的对象层次结构



我正在尝试正确编写代码来构建要序列化为 json 的数据结构。

我正在使用 json.net。

我不想创建一堆类来保存这些数据,因为我认为应该有一些类已经在 json.net 中执行此操作

我已经在一系列嵌套循环中获得了我需要的所有数据,现在我只想在运行 JsonConvert.SerializeObject 之前将它们添加到对象层次结构中。

我已经尝试过这样的代码,但它似乎不起作用

JArray container = new JArray();
        container.Add(new JObject(new JProperty("name", "Client1"), new JProperty("projects", new JArray())));
        container[0].AddAfterSelf(new JObject(new JProperty("projects", new JArray())));            
        container[1].AddAfterSelf(new JObject(new JProperty("projects", "Project2")));
        container[1].AddAfterSelf(new JObject(new JProperty("projects", "Project3")));
        container.Add(new JProperty("name", "Client2"));            
        var test = JsonConvert.SerializeObject(container);

问题是,当我使用 [i] 或 ElementAt(i) 访问结构中的某个位置时,要么 .缺少 Add() 或 。ElementAt 不在那里。如何逐步执行数据结构以使其很好地输出以下内容,还是必须为所有这些创建自己的容器类?

这是我正在尝试制作的数据格式。

[
    {
    "name": "student1",
    "projects": 
    [
        {
        "name": "Project1",
        "tasks": 
                [
                    {
                    "name": "task1",
                    "id": 2
                    }
                ],
        "id": 6
        }
    ]
},
    {
    "name": "Student2",
    "projects": [
                {
                "name": "Project1",
                "tasks": [
                         {
                         "name": "Task2",
                         "id": 1
                         },
                         {
                         "name": "Task3",
                         "id": 3
                         },
                         {
                         "name": "Task4",
                         "id": 4
                         }
                         ],
                "id": 2

等。。。

我认为您要问的是如何在 json 中序列化复杂的业务对象,但只公开某些属性。

换句话说,您

已经有一个学生列表,但您只想通过 json 发送非常具体的数据。如果我错了,这个答案不适合您的需求。

因此,假设您有一个学生列表,其项目属性具有任务的内部属性,这就是我无需创建大量新类即可执行此操作的方法,我使用匿名对象。

创建匿名对象列表后,只需将它们转换为 json 字符串即可。

正如注释中指出的,您不需要使用 json.net,此功能在框架中可用,然后添加对System.Web.Extensions.dll的引用

使用System.Web.Script.Serialization;

var jsonStudents = new List<object>();
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);

如果你真的想使用循环,你可以这样做,以允许你在创建项目和任务时做更复杂的事情:

var jsonStudents = new List<object>();
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<object>()
    };
    foreach (var project in student.Projects)
    {
        var tempProject = new {
            project.Id,
            project.Name,
            Tasks = new List<object>()
        };
        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);

这是从您的问题生成确切输出的代码(需要using Newtonsoft.Json.Linq;):

var json = new JArray(
                new JObject(
                    new JProperty("name", "student1"),
                    new JProperty("projects", 
                        new JArray(
                            new JObject(
                                new JProperty("name", "Project1"),
                                new JProperty("tasks", 
                                    new JArray(
                                        new JObject(
                                            new JProperty("name", "task1"),
                                            new JProperty("id", 2)
                                            )
                                        )
                                    ),
                                new JProperty("id", 6)
                            )
                        )
                    )
                ),
                new JObject(
                    new JProperty("name", "student2"),
                    new JProperty("projects", 
                        new JArray(
                            new JObject(
                                new JProperty("name", "Project1"),
                                new JProperty("tasks", 
                                    new JArray(
                                        new JObject(
                                            new JProperty("name", "task2"),
                                            new JProperty("id", 1)
                                            ),
                                        new JObject(
                                            new JProperty("name", "task3"),
                                            new JProperty("id", 3)
                                            ),
                                        new JObject(
                                            new JProperty("name", "task4"),
                                            new JProperty("id", 4)
                                            )
                                        )
                                    ),
                                new JProperty("id", 2)
                            )
                        )
                    )
                )
            );
var jsonString = json.ToString();

我相信使用 Json.Net Linq 语法具有很大的优势,即生成的 C# 代码可以格式化,使其几乎与您尝试生成的 JSON 具有相同的结构。

更新

如果要在构建 Json 对象后对其进行操作,请查看此示例,该示例仅使用一个学生构建外部数组,然后附加另一个学生

// create an isolated Student instance:
var student2 = new JObject(
                    new JProperty("name", "student2"),
                    new JProperty("projects", 
                        new JArray(
                            new JObject(
                                new JProperty("name", "Project1"),
                                new JProperty("tasks", 
                                    new JArray(
                                        new JObject(
                                            new JProperty("name", "task2"),
                                            new JProperty("id", 1)
                                            ),
                                        new JObject(
                                            new JProperty("name", "task3"),
                                            new JProperty("id", 3)
                                            ),
                                        new JObject(
                                            new JProperty("name", "task4"),
                                            new JProperty("id", 4)
                                            )
                                        )
                                    ),
                                new JProperty("id", 2)
                            )
                        )
                    )
                );
var json = new JArray(
                new JObject(
                    new JProperty("name", "student1"),
                    new JProperty("projects", 
                        new JArray(
                            new JObject(
                                new JProperty("name", "Project1"),
                                new JProperty("tasks", 
                                    new JArray(
                                        new JObject(
                                            new JProperty("name", "task1"),
                                            new JProperty("id", 2)
                                            )
                                        )
                                    ),
                                new JProperty("id", 6)
                            )
                        )
                    )
                )
            );
// now, add the student2 instance to the array:
json                             // which is an JArray
    .Last                        // gets the last Array item, i.e. "student1"
    .AddAfterSelf(student2);     // adds this which hence becomes the new last one

这个想法是,你可以以同样的方式将相同的原则应用于结构的任何其他部分。

呵......

最后我使用了这些模型。

public class JStudent
{
    public List<JProject> projects = new List<JProject>();
    public string name;
    public string id;
}
public class JProject
{
    public List<JTask> tasks = new List<JTask>();
    public string name;
    public string id;
}
public class JTask
{
    public string name;
    public string id;
}

它现在工作得很好。有没有更好的方法可以做到这一点?

相关内容

  • 没有找到相关文章

最新更新