首页 > 解决方案 > 在 C# 中从更大的 json 创建简化的 json

问题描述

我有一个来自与此类似的服务器的 json(具有多个嵌套的 json 对象)。

{
"employee": [{
        "fullname": {
            "firstname": "abcd",
            "lastname": "defg"
        },
        "project": [{
                "projectname":"abcd_1",
                "datejoined": "2019-06-18T01:29:38.6013262+00:00",
                "projectmanager": "abcdM1",
            }, {
                "projectname":"abcd_2",
                "datejoined": "2018-06-18T01:29:38.6013262+00:00",
                "projectmanager": "abcdM2",
            }, {
                "projectname":"abcd_3",
                "datejoined": "2017-06-18T01:29:38.6013262+00:00",
                "projectmanager": "abcdM3",
            }
        ]
    },{
        "fullname": {
            "firstname": "abcd",
            "lastname": "defg"
        },
        "project": [{
                "projectname":"abcd_1",
                "datejoined": "2019-06-18T01:29:38.6013262+00:00",
                "projectmanager": "abcdM1",
            }, {
                "projectname":"abcd_2",
                "datejoined": "2018-06-18T01:29:38.6013262+00:00",
                "projectmanager": "abcdM2",
            }, {
                "projectname":"abcd_3",
                "datejoined": "2017-06-18T01:29:38.6013262+00:00",
                "projectmanager": "abcdM3",
            }
        ]
      }
    ]

}

服务组件将仅以简化的 json 格式将相关数据发送到 UX。
我想提取employee.fullname.firstname 和employee.project.projectname。

输出应该是

{
"employee": [{
        "fullname": {
            "firstname": "abcd",
        },
        "project": [{
                "projectname":"abcd_1",
            }, {
                "projectname":"abcd_2",
            }, {
                "projectname":"abcd_3",
            }
        ]
    },{
        "fullname": {
            "firstname": "abcd",

        },
        "project": [{
                "projectname":"abcd_1",

            }, {
                "projectname":"abcd_2",

            }, {
                "projectname":"abcd_3",

            }
        ]
      }
    ]

}

我将 Json 展平,但它给出的标签为employee.0.fullname.firstname 和employee.0.project.0.projectname 等

在有/没有展平的情况下提取的最佳方法是什么?

标签: c#jsonlinqjson.net

解决方案


这是一个使用仅具有您想要的属性的 poco 的示例,您可以在此对象中反序列化它,然后序列化回 json 以获得您想要的东西。

void Main()
{
    var myJson = @"
    {
        ""employee"": [{
            ""fullname"": {
                ""firstname"": ""abcd"",
                ""lastname"": ""defg""
            },
            ""project"": [{
                    ""projectname"":""abcd_1"",
                    ""datejoined"": ""2019-06-18T01:29:38.6013262+00:00"",
                    ""projectmanager"": ""abcdM1"",
                }, {
                    ""projectname"":""abcd_2"",
                    ""datejoined"": ""2018-06-18T01:29:38.6013262+00:00"",
                    ""projectmanager"": ""abcdM2"",
                }, {
                    ""projectname"":""abcd_3"",
                    ""datejoined"": ""2017-06-18T01:29:38.6013262+00:00"",
                    ""projectmanager"": ""abcdM3"",
                }
            ]
        },{
            ""fullname"": {
                ""firstname"": ""abcd"",
                ""lastname"": ""defg""      
            },
            ""project"": [{
                    ""projectname"":""abcd_1"",
                    ""datejoined"": ""2019-06-18T01:29:38.6013262+00:00"",
                    ""projectmanager"": ""abcdM1"",
                }, {
                    ""projectname"":""abcd_2"",
                    ""datejoined"": ""2018-06-18T01:29:38.6013262+00:00"",
                    ""projectmanager"": ""abcdM2"",
                }, {
                    ""projectname"":""abcd_3"",
                    ""datejoined"": ""2017-06-18T01:29:38.6013262+00:00"",
                    ""projectmanager"": ""abcdM3"",
                }
            ]
          }
        ]
    }";


    var myObject = Newtonsoft.Json.JsonConvert.DeserializeObject<Employee>(myJson);
    var myTrimmedJson = Newtonsoft.Json.JsonConvert.SerializeObject(myObject);
    Console.WriteLine(myTrimmedJson);
}

public class Fullname
{
    public String firstname { get; set; }
    //public String lastname { get; set; }
}

public class Project
{
    public String projectname { get; set; }
    //public String datejoined { get; set; }
    //public String projectmanager { get; set; }
}

public class Person
{
    public Fullname fullname { get; set; }
    public List<Project> project { get; set; }
}

public class Employee
{
    public List<Person> employee { get; set; }
}

推荐阅读