c# - 如何使用 json.net 构建用于序列化的对象层次结构?

标签 c# linq json serialization 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 发送非常具体的数据。如果我错了,这个答案将不适合您的需求。

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

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

正如评论中指出的你不需要使用 json.net,这个功能在框架中是可用的,添加对 System.Web.Extensions.dll 的引用 然后

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

关于c# - 如何使用 json.net 构建用于序列化的对象层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5978904/

相关文章:

Python 脚本循环遍历文件并通过请求调用 api,然后将结果存储到文本文件

c# - 无法用包含 $0 的动态字符串替换文本

arrays - 使用 LINQ 如何连接来自 SortedDictionary<string,List<byte[]>> 的字节

javascript - 如何从ajax数据结果填充javascript数组

安卓连接mysql

c# - 如何将 LINQ 查询中的 "var"填充到同一个数据表中?

c# - 正确的数据类型用于类型映射?

c# - MVC Web API 2 中的点字符 '.' 用于 api/people/STAFF.45287 等请求

c# - 如何在 T4 文本模板中使用自定义库/项目?

mysql - Entity Framework -> MySql 给出 'Function evaluation timed out.'