我正在尝试正确编写代码以构建数据结构以序列化为 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/