Newtonsoft Json - 根据给定的选定属性序列化深度嵌套对象
Posted
技术标签:
【中文标题】Newtonsoft Json - 根据给定的选定属性序列化深度嵌套对象【英文标题】:Newtonsoft Json - Serialize Deep nested object based on given selected properties 【发布时间】:2022-01-04 11:55:13 【问题描述】:Newtonsoft Json 是否有任何方法可以序列化仅具有选定属性的嵌套对象? 模型如下:
class Node
int id get; set; ;
string name get; set; ;
IList<Node>children get; set; ;
之后我正在创建一个看起来像这样的树结构:
"id": 1,
"name": "A",
"children": [
"id": 2,
"name": "B",
"children": null
,
"id": 3,
"name": "C",
"children": [
"id": 10,
"name": "D",
"children": null
]
]
编写了我自己的序列化程序。我只通过了 Children 属性。它显示为:
"children": [
"children": null
,
"children": [
"children": null
]
]
我想显示所有属性,而不仅仅是 1st/root 的子项下的子项。与下面类似。
"children": [
"id": 2,
"name": "B",
"children": null
,
"id": 3,
"name": "C",
"children": [
"id": 10,
"name": "D",
"children": null
]
]
还有我要如何对children.Id做同样的事情,我想序列化所有children.Id的根节点,类似于下面
"children": [
"id": 2
,
"id": 3
]
【问题讨论】:
【参考方案1】:他们已经完成了您希望在此页面上实现的相同结果。
https://weblog.west-wind.com/posts/2012/aug/30/using-jsonnet-for-dynamic-json-parsing
另外,请看这里,
https://entityframeworkcore.com/knowledge-base/58283745/self-reference-when-serializing-nested-object
希望对你有用。
【讨论】:
JObject 创建和循环遍历所有数据并将它们填充到 JObject 中似乎对我来说是海量数据的性能问题。【参考方案2】:您需要自己的序列化程序来做什么?试试标准的
var jsonDeserialized = JsonConvert.DeserializeObject<Child>(json);
json = JsonConvert.SerializeObject(jsonDeserialized);
输出
"id": 1,
"name": "A",
"children": [
"id": 2,
"name": "B",
"children": null
,
"id": 3,
"name": "C",
"children": [
"id": 10,
"name": "D",
"children": null
]
]
类
public partial class Child
[JsonProperty("id")]
public long Id get; set;
[JsonProperty("name")]
public string Name get; set;
[JsonProperty("children")]
public List<Child> Children get; set;
为此
"children": [
"id": 2,
"name": "B",
"children": null
,
"id": 3,
"name": "C",
"children": [
"id": 10,
"name": "D",
"children": null
]
]
你可以使用
var jsonDeserialized = JsonConvert.DeserializeObject<Data>(json);
public partial class Data
[JsonProperty("children")]
public List<Child> Children get; set;
【讨论】:
如果我现在不想包含孩子怎么办,我想要一些其他属性,也许是另一个模型的 XYZ。我是否为每个模型创建这些部分类?如果我想要 Children.Children 怎么办? @netcoredev "如果我想要什么" - 你必须决定你想要什么,然后才询问如何达到它。如果需要,您需要为每个类提供一个类,或者至少需要一个 JToken。 将尝试 JToken 方式。谢谢以上是关于Newtonsoft Json - 根据给定的选定属性序列化深度嵌套对象的主要内容,如果未能解决你的问题,请参考以下文章
Newtonsoft Json.NET 版本不兼容(DLL 地狱)
Newtonsoft.Json 序列 反序列 IEnumerable
带有 MVC4 的 Newtonsoft JSON 无法转换参数类型
FineUI中Newtonsoft.Json版本报错解决办法
“Newtonsoft.Json.JsonConvert”类型存在于“Newtonsoft.Json.dll”和“NuGetApi2.dll”中