【问题标题】:Newtonsoft Json - Serialize Deep nested object based on given selected propertiesNewtonsoft Json - 根据给定的选定属性序列化深度嵌套对象
【发布时间】: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
    }
]

}

【问题讨论】:

    标签: c# serialization json.net datacontractserializer


    【解决方案1】:

    【讨论】:

    • 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 方式。谢谢
    猜你喜欢
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2021-08-27
    • 1970-01-01
    相关资源
    最近更新 更多