如何在 C# 中使用 JSON 反序列化 oData V2?

Posted

技术标签:

【中文标题】如何在 C# 中使用 JSON 反序列化 oData V2?【英文标题】:How to deserialize oData V2 with JSON in C#? 【发布时间】:2021-12-15 06:20:21 【问题描述】:

我正在尝试使用 C# 反序列化 oData V2,但值始终为空:

    
    "d": 
        "results": [
        
            "__metadata": 
            "id": "http://vhcalnplci:8000/sap/opu/odata/SAP/ZEMPLOYEE_SRV/EmployeeEntitySet('111111')",
            "uri": "http://vhcalnplci:8000/sap/opu/odata/SAP/ZEMPLOYEE_SRV/EmployeeEntitySet('111111')",
            "type": "ZEMPLOYEE_SRV.EmployeeEntity"
            ,
            "Empno": "111111",
            "Fname": "Test Firstname",
            "Lname": "Test Lastname",
            "Addrs": "Test Address",
            "Desgn": "Test Job"
            
        ]
    

我在 Visual Studio 中尝试过 CLR 类生成,并创建了以下类

public class Rootobject
    
        public D d  get; set; 
    

    public class D
    
        public Result[] results  get; set; 
    

    public class Result
    
        public __Metadata __metadata  get; set; 
        public string Empno  get; set; 
        public string Fname  get; set; 
        public string Lname  get; set; 
        public string Addrs  get; set; 
        public string Desgn  get; set; 
    

    public class __Metadata
    
        public string id  get; set; 
        public string uri  get; set; 
        public string type  get; set; 
    

    internal class OData<Result>
    
        public List<Result> Value  get; set; 
    

我使用的方法,结果总是为零

using (var client = new HttpClient())
 
     HttpResponseMessage response = await client.GetAsync(new Uri(url));
     var json = await response.Content.ReadAsStringAsync();
     var result = JsonConvert.DeserializeObject<OData<Employee>>(json);
     var employee = result.Value;
 

你能告诉我我做错了什么吗?谢谢!

【问题讨论】:

不应该OData&lt;Employee&gt;OData&lt;Result&gt; @ErmiyaEskandary 不是真的 - OData&lt;T&gt; 类甚至与 JSON 无关(任何地方都没有 Value 属性)。唯一合乎逻辑的方法是使用 DeserializeObject&lt;Root&gt; - 但 OP 声称结果是相同的,这让我觉得这里没有显示其他内容 @CamiloTerevinto 是的,这就是我想要去的地方 - 它甚至不相关,但我不确定代码是否已编译 【参考方案1】:

改变这一行

 var result = JsonConvert.DeserializeObject<OData<Employee>>(json);

进入

 var result = JsonConvert.DeserializeObject<Rootobject>(json); 

【讨论】:

谢谢你的回答,我也试过Rootobject和Result,但也有result "null" 谢谢 var result = JsonConvert.DeserializeObject(json);工作! @InzinjerIzBosne 哎呀,这是我的错,它不是 Root,根据你的课程,它应该是 Rootobject。无论如何都很乐意帮助你。

以上是关于如何在 C# 中使用 JSON 反序列化 oData V2?的主要内容,如果未能解决你的问题,请参考以下文章

在C#中,Json的序列化和反序列化的几种方式总结

如何在C#中解析/反序列化从rest服务返回的JSON

使用 C# 反序列化复杂的嵌套 JSON

在C#中,Json的序列化和反序列化的几种方式总结

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

[C#]如何使用Newton.Json从流中反序列化json数据