如何在 C# 中访问 Json(这是 HttpMessage 的结果)?

Posted

技术标签:

【中文标题】如何在 C# 中访问 Json(这是 HttpMessage 的结果)?【英文标题】:How to access Json (which was a result of HttpMessage) in C#? 【发布时间】:2021-11-16 21:19:30 【问题描述】:

我正在用 .NET 编写两个应用程序(Web API)。从应用程序 A 我想使用 Http 请求在应用程序 B 的控制器中调用一个方法。 这里

 using (var askPensionerDetails = new HttpClient())
            
                double pensionToDisburse = 0;
                askPensionerDetails.BaseAddress = new Uri("http://localhost:55345/api/pensionerdetails/");
                var responseTask = askPensionerDetails.GetAsync("getById?pan=" + inputOfPensioner.PAN);
                responseTask.Wait();
                var result =responseTask.Result ;
                if (result.IsSuccessStatusCode)
                
                     var readTask = result.Content.ReadFromJsonAsync<object>();
                     readTask.Wait();
                     return Ok(readTask.Result);
                
            

邮递员的输出是


    "name": "bunk seenu",
    "dateOfBirth": "1990-01-02T00:00:00",
    "pan": "ABCD12351E",
    "salaryEarned": 45000,
    "allowances": 500,
    "pensionType": 1,
    "bankDetails": 
        "bankName": "SBI",
        "accountNumber": "SBI00001BS",
        "bankType": 0
    


这是一个理想的输出。但问题是如何访问bankdetails、name、pan、salaryEarned等属性。

我尝试过使用 readTask.Result["name"] 但它抛出错误。

我也尝试过使用 result.Content.ReadAsStringASync(); 但是邮递员的输出是


    "name": [],
    "dateOfBirth": [],
    "pan": [],
    "salaryEarned": [],
    "allowances": [],
    "pensionType": [],
    "bankDetails": [
        [
            []
        ],
        [
            []
        ],
        [
            []
        ]
    ]

对于语句 readTask = result.Content.ReadFromJsonAsync();,我没有与 Json 结果类型关联的类; (根据设计限制)。

【问题讨论】:

【参考方案1】:

来自docs:

如果您有想要反序列化的 JSON,但没有将其反序列化的类,则除了手动创建所需的类之外,您还有其他选择:

反序列化为 JSON DOM (document object model) 并从 DOM 中提取您需要的内容。

DOM 允许您导航到 JSON 有效负载的子部分并反序列化单个值、自定义类型或数组。有关 .NET 6 中的 JsonNode DOM 的信息,请参阅 Deserialize subsections of a JSON payload。有关JsonDocument DOM 的信息,请参阅How to search a JsonDocument and JsonElement for sub-elements。

直接使用Utf8JsonReader。

使用 Visual Studio 2019 自动生成你需要的类:

复制需要反序列化的 JSON。 创建类文件并删除模板代码。 选择编辑 > 选择性粘贴 > 将 JSON 粘贴为类。结果是一个可用于反序列化目标的类。

【讨论】:

嘿,效果很好。感谢您的回复:)【参考方案2】:

你可以使用 Newtonsoft.Json

JObject jo = JObject.Parse(readTask.Result);
var name = jo["name"];
if(string.IsNnullOrEmpty(name))
///some code 

【讨论】:

您好,感谢您的回复。但这没有用。结果是 ValueKind :[] dotnetfiddle.net/Ki2WgU# 这是示例。

以上是关于如何在 C# 中访问 Json(这是 HttpMessage 的结果)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 c# 从 ajax 中的嵌套 JSON 对象中获取值

如何在 C# 中编写 JSON 文件?

如何在统一 C# 中解析来自 JSON 的数据? [复制]

如何在 C# 中解析复杂的 JSON?最终我想在 DataGridView 中显示结果 [关闭]

如何在 C# 中按 ID 对 JSON 数据进行分组

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