如何在 C# 中使用嵌套的 json 对象

Posted

技术标签:

【中文标题】如何在 C# 中使用嵌套的 json 对象【英文标题】:how to work with nested json object in c# 【发布时间】:2021-12-18 08:08:57 【问题描述】:

api 返回嵌套的 json,我不知道从中检索数据并将其映射到我的模型。我想从嵌套中检索数据,但不确定如何使用索引和值来执行此操作。提前致谢。

   public class MikesExcelModel
    
        //public int id;
        //public object AuthorizingManagerId;
        public string Name;
        //public DateTime UpdateDate;
        public string Phone;
        public string Email;
    




    public class MikesExcelResults
    
        public List<MikesExcelModel> value = new List<MikesExcelModel>();
    


    public List<MikesExcelModel> GetExcel()
    
        using (HttpClient client = new HttpClient())
        
            addToken(client);
            var result = client.GetAsync("https://graph.microsoft.com/beta/sites/ucfdev.sharepoint.com,4c319763-130d-4ee1-bc1f-72543da0a847,8a2f59f4-9d56-4aec-be21-33d0347293d1/drives/b!Y5cxTA0T4U68H3JUPaCoR_RZL4pWnexKviEz0DRyk9HjXtfo70gjRbH706GdwO5m/items/01HA4SXKSESD3RW3UYPNCZ2OHQAEWWDTKH/workbook/worksheets('sheet1')/tables(%27%7B079215E2-A6D7-4CC2-AB1E-9AC38F36D1CC%7D%27)/rows").Result;
            if (result.IsSuccessStatusCode)
            
                var responseContent = result.Content;

                // by calling .Result you are synchronously reading the result
                string responseString = responseContent.ReadAsStringAsync().Result;
                javascriptSerializer serialiser = new JavaScriptSerializer();
               // dynamic apiResult = serialiser.DeserializeObject(responseString);
  
                 return Utilities.DeserializeObject<MikesExcelResults>(result.Content.ReadAsStringAsync().Result).value;
            
            else
                throw new Exception("Couldn't get excel datas.");

        
    


api返回的数据如下:


    "@odata.context": "https://graph.microsoft.com/beta/$metadata#sites('ucfdev.sharepoint.com%2C4c319763-130d-4ee1-bc1f-72543da0a847%2C8a2f59f4-9d56-4aec-be21-33d0347293d1')/drives('b%21Y5cxTA0T4U68H3JUPaCoR_RZL4pWnexKviEz0DRyk9HjXtfo70gjRbH706GdwO5m')/items('01HA4SXKSESD3RW3UYPNCZ2OHQAEWWDTKH')/workbook/worksheets('sheet1')/tables('%7B079215E2-A6D7-4CC2-AB1E-9AC38F36D1CC%7D')/rows",
    "value": [
        
            "@odata.id": "/sites('ucfdev.sharepoint.com%2C4c319763-130d-4ee1-bc1f-72543da0a847%2C8a2f59f4-9d56-4aec-be21-33d0347293d1')/drives('b%21Y5cxTA0T4U68H3JUPaCoR_RZL4pWnexKviEz0DRyk9HjXtfo70gjRbH706GdwO5m')/items('01HA4SXKSESD3RW3UYPNCZ2OHQAEWWDTKH')/workbook/worksheets(%27%7B00000000-0001-0000-0000-000000000000%7D%27)/tables(%27%7B079215E2-A6D7-4CC2-AB1E-9AC38F36D1CC%7D%27)/rows/itemAt(index=0)",
            "index": 0,
            "values": [
                [
                    "Mike Callahan",
                    "407-266-1431",
                    "MTC@ucf.edu"
                ]
            ]
        ,
        
            "@odata.id": "/sites('ucfdev.sharepoint.com%2C4c319763-130d-4ee1-bc1f-72543da0a847%2C8a2f59f4-9d56-4aec-be21-33d0347293d1')/drives('b%21Y5cxTA0T4U68H3JUPaCoR_RZL4pWnexKviEz0DRyk9HjXtfo70gjRbH706GdwO5m')/items('01HA4SXKSESD3RW3UYPNCZ2OHQAEWWDTKH')/workbook/worksheets(%27%7B00000000-0001-0000-0000-000000000000%7D%27)/tables(%27%7B079215E2-A6D7-4CC2-AB1E-9AC38F36D1CC%7D%27)/rows/itemAt(index=1)",
            "index": 1,
            "values": [
                [
                    "Michael Callahan",
                    "407-823-3455",
                    "mtcallah@ucf.edu"
                ]
            ]
        ,
        
            "@odata.id": "/sites('ucfdev.sharepoint.com%2C4c319763-130d-4ee1-bc1f-72543da0a847%2C8a2f59f4-9d56-4aec-be21-33d0347293d1')/drives('b%21Y5cxTA0T4U68H3JUPaCoR_RZL4pWnexKviEz0DRyk9HjXtfo70gjRbH706GdwO5m')/items('01HA4SXKSESD3RW3UYPNCZ2OHQAEWWDTKH')/workbook/worksheets(%27%7B00000000-0001-0000-0000-000000000000%7D%27)/tables(%27%7B079215E2-A6D7-4CC2-AB1E-9AC38F36D1CC%7D%27)/rows/itemAt(index=2)",
            "index": 2,
            "values": [
                [
                    "cvcfcv",
                    "zVCCvc",
                    "cvvvvb"
                ]
            ]
        
    ]

【问题讨论】:

看起来 MikesExcelModel 应该只有 int indexList&lt;string&gt; values 字段。不清楚其他字段NamePhoneEmail应该如何映射,当然序列化器不知道 【参考方案1】:

可能是使用Newtonsoft.Json 库提取 JSON 数据的传统方式。

    jsonData 转换为JObject(通过JObject.Parse)。 获取一级value。 获取二级values。 扁平化二级values

来自

[[["Mike Callahan", "407-266-1431", "MTC@ucf.edu"], ...]]

[["Mike Callahan", "407-266-1431", "MTC@ucf.edu"], ...]
    flattenChildrenValues 转换为List&lt;MikesExcelModel&gt;。 将List&lt;MikesExcelModel&gt; 添加到results.value
using System;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
using System.Linq;
var jsonData = @"
            ""@odata.context"": ""https://graph.microsoft.com/beta/$metadata#sites('ucfdev.sharepoint.com%2C4c319763-130d-4ee1-bc1f-72543da0a847%2C8a2f59f4-9d56-4aec-be21-33d0347293d1')/drives('b%21Y5cxTA0T4U68H3JUPaCoR_RZL4pWnexKviEz0DRyk9HjXtfo70gjRbH706GdwO5m')/items('01HA4SXKSESD3RW3UYPNCZ2OHQAEWWDTKH')/workbook/worksheets('sheet1')/tables('%7B079215E2-A6D7-4CC2-AB1E-9AC38F36D1CC%7D')/rows"",
            ""value"": [
                
                    ""@odata.id"": ""/sites('ucfdev.sharepoint.com%2C4c319763-130d-4ee1-bc1f-72543da0a847%2C8a2f59f4-9d56-4aec-be21-33d0347293d1')/drives('b%21Y5cxTA0T4U68H3JUPaCoR_RZL4pWnexKviEz0DRyk9HjXtfo70gjRbH706GdwO5m')/items('01HA4SXKSESD3RW3UYPNCZ2OHQAEWWDTKH')/workbook/worksheets(%27%7B00000000-0001-0000-0000-000000000000%7D%27)/tables(%27%7B079215E2-A6D7-4CC2-AB1E-9AC38F36D1CC%7D%27)/rows/itemAt(index=0)"",
                    ""index"": 0,
                    ""values"": [
                        [
                            ""Mike Callahan"",
                            ""407-266-1431"",
                            ""MTC@ucf.edu""
                        ]
                    ]
                ,
                
                    ""@odata.id"": ""/sites('ucfdev.sharepoint.com%2C4c319763-130d-4ee1-bc1f-72543da0a847%2C8a2f59f4-9d56-4aec-be21-33d0347293d1')/drives('b%21Y5cxTA0T4U68H3JUPaCoR_RZL4pWnexKviEz0DRyk9HjXtfo70gjRbH706GdwO5m')/items('01HA4SXKSESD3RW3UYPNCZ2OHQAEWWDTKH')/workbook/worksheets(%27%7B00000000-0001-0000-0000-000000000000%7D%27)/tables(%27%7B079215E2-A6D7-4CC2-AB1E-9AC38F36D1CC%7D%27)/rows/itemAt(index=1)"",
                    ""index"": 1,
                    ""values"": [
                        [
                            ""Michael Callahan"",
                            ""407-823-3455"",
                            ""mtcallah@ucf.edu""
                        ]
                    ]
                ,
                
                    ""@odata.id"": ""/sites('ucfdev.sharepoint.com%2C4c319763-130d-4ee1-bc1f-72543da0a847%2C8a2f59f4-9d56-4aec-be21-33d0347293d1')/drives('b%21Y5cxTA0T4U68H3JUPaCoR_RZL4pWnexKviEz0DRyk9HjXtfo70gjRbH706GdwO5m')/items('01HA4SXKSESD3RW3UYPNCZ2OHQAEWWDTKH')/workbook/worksheets(%27%7B00000000-0001-0000-0000-000000000000%7D%27)/tables(%27%7B079215E2-A6D7-4CC2-AB1E-9AC38F36D1CC%7D%27)/rows/itemAt(index=2)"",
                    ""index"": 2,
                    ""values"": [
                        [
                            ""cvcfcv"",
                            ""zVCCvc"",
                            ""cvvvvb""
                        ]
                    ]
                
            ]
        ";
        
var jsonObj = JObject.Parse(jsonData);
// Get first-level value
JArray jsonValue = jsonObj["value"] as JArray;

// Get second-level values
var childrenValues = jsonValue.Children<JObject>()["values"];
        
// Flatten second-level values
var flattenChildrenValues = childrenValues.Values<JArray>() as IEnumerable<JArray>;

// Read flattenChildrenValues to List<MikesExcelModel>
List<MikesExcelModel> excelModels = flattenChildrenValues
    .Select(x => new MikesExcelModel
                
                    Name = x[0].ToString(),
                    Phone = x[1].ToString(),
                    Email = x[2].ToString()
                )
    .ToList();
        
// Add List<MikesExcelModel> to results.value
MikesExcelResults results = new MikesExcelResults();
results.value.AddRange(excelModels);
                
foreach (var model in results.value)

    Console.WriteLine(String.Format("Name: 0, Phone: 1, Email: 2", model.Name, model.Phone, model.Email));    

Sample program

【讨论】:

以上是关于如何在 C# 中使用嵌套的 json 对象的主要内容,如果未能解决你的问题,请参考以下文章

C# json反序列化 对象中嵌套数组 (转载)

如何反序列化包含同一类嵌套的json类(Unity C#)?

在 C# 中,如何为具有多个嵌套数组的 JSON 对象建模?

如何在 C# 中创建嵌套(父子)JSON 响应?

如何使用 Mustache 在服务器端的 json 数组中显示嵌套的 json 对象

如何在 Angular 中为嵌套的 JSON 对象使用搜索过滤器?