如何使用 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
ETC...
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 this data, as I thought there should be some classes that will already do this in json.net
I've already got all the data I need in a series of nested loops, and now I just want to add them to an object hierarchy before I run JsonConvert.SerializeObject on it.
I've already tried code like this, but it doesn't seem to work
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);
The problem is that when I use [i]. or ElementAt(i) to access somewhere in the structure, either .Add() is missing or .ElementAt isn't there.
How do I step through the data structure to make this nicely output the below, or do I have to create my own container class for all of this?
This is the data format I am trying to make.
[
{
"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
etc...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我认为您要问的是如何在 json 中序列化复杂的业务对象,但只公开某些属性。
换句话说,您已经有了学生列表,但您只想通过 json 发送非常具体的数据。如果我错了,这个答案将无法满足您的需求。
因此,假设您有一个学生列表,其中的项目属性具有任务的内部属性,这就是我的做法,而无需创建大量新类,我使用匿名对象。
创建匿名对象列表后,我只需将它们转换为 json 字符串即可。
正如评论中指出的,您不需要使用 json.net,该功能在框架中可用,添加对 System.Web.Extensions.dll 的引用,然后
如果您确实想使用循环,您可以这样做,以便您在创建项目和任务时执行更复杂的操作:
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
thenIf 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:
这是根据您的问题生成准确输出的代码(需要
using Newtonsoft.Json.Linq;
):我相信使用 Json.Net Linq 语法具有很大的优势,生成的 C# 代码可以进行格式化,使其几乎与您尝试生成的 JSON 具有相同的结构。
更新
如果您想在构建 Json 对象后对其进行操作,请查看此示例,该示例仅使用一名学生构建外部数组,然后附加另一个
:想法是,您可以以相同的方式将相同的原理应用于结构的任何其他部分。
哈...
this is the code which generates the exact output from your question (requires a
using Newtonsoft.Json.Linq;
):I believe using the Json.Net Linq syntax has the great advantage that the resulting C# code can be formatted so that it almost has the same structure as the JSON you're trying to generate.
UPDATE
If you want to manipulate the Json object once it has been built, look at this example which builds the outer array with only one student, and then appends another one:
The idea is that you can apply the very same principle to any other portion of the structure in the same way.
HTH...
最后我使用了这些模型。
现在它工作得很好。有没有更好的方法来做到这一点?
In the end I have used these Models.
It is now working perfectly. Is there any better way to do this?