You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C#中反序列化OData V2格式JSON并解决Value为null问题

错误原因
  1. 反序列化使用的目标类OData<Result>与实际OData V2返回的JSON结构不匹配:你定义的类期望根节点下存在Value字段,但OData V2的返回结构根节点是d,业务数据列表存放在d.results字段下,JSON中不存在Value字段,因此反序列化后得到空值。
  2. 你已经通过Visual Studio生成了完全匹配JSON结构的Rootobject系列类,但反序列化时没有使用该系列类,反而用了结构不匹配的自定义OData<Employee>类。
修复方案

方案1:直接使用已生成的匹配类反序列化

直接将反序列化目标类型指定为你已经生成的Rootobject即可:

using (var client = new HttpClient())
{
    HttpResponseMessage response = await client.GetAsync(new Uri(url));
    var json = await response.Content.ReadAsStringAsync();
    // 替换为匹配结构的Rootobject类反序列化
    var result = JsonConvert.DeserializeObject<Rootobject>(json);
    // 读取数据的路径为d.results
    var employees = result.d.results;
}

方案2:修改泛型OData类适配OData V2结构

如果你需要保留泛型复用的能力,调整OData类的结构匹配V2规范:

// 修改后的泛型OData类,适配V2的d -> results结构
internal class OData<T>
{
    public D<T> d { get; set; }
}

public class D<T>
{
    public List<T> results { get; set; }
}

// 你的Employee类属性要和JSON字段一致,示例:
public class Employee
{
    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; }
}

修改后反序列化代码如下:

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);
    // 数据读取路径为d.results
    var employees = result.d.results;
}

内容的提问来源于stack exchange,提问作者Inzinjer Iz Bosne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:09:06