如何在C#中反序列化OData V2格式JSON并解决Value为null问题
错误原因
- 反序列化使用的目标类
OData<Result>与实际OData V2返回的JSON结构不匹配:你定义的类期望根节点下存在Value字段,但OData V2的返回结构根节点是d,业务数据列表存放在d.results字段下,JSON中不存在Value字段,因此反序列化后得到空值。 - 你已经通过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
相关产品推荐
相关产品推荐

