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”中

Newtonsoft.Json(Json.net) 的使用