反序列化Web Api OData响应

时间:2014-08-05 09:11:09

标签: c# json linq serialization odata

我有一个OData V4控制器返回的Entity Framework对象。 我返回一个IQueryable,如果我调用没有任何OData子句的OData端点,我可以成功地执行此操作:

var content = response.Content.ReadAsAsync<IQueryable<Person>>();

JSON中的响应如下:

{
  "@odata.context":"http://xxx:8082/odata/$metadata#Persons","value":[
    {
      "Id":"291b9f1c-2587-4a35-993e-00033a81f6d5",
      "Active":true,
      "Alert":"Some alerts for the Person",
      "Comments":"Some comments for the Person"
    }
  ]
}

但是一旦我开始使用OData,例如在Complex属性上使用$ expand,我就会得到以下异常:

无法将当前JSON对象(例如{&#34; name&#34;:&#34; value&#34;})反序列化为类型System.Linq.IQueryable`1 [xxx.Person]&#39;因为类型需要JSON数组(例如[1,2,3])才能正确反序列化。

响应如下:

{
  "@odata.context":"http://aqavnext01:8082/odata/$metadata#Persons","value":[
    {
      "Id":"291b9f1c-2587-4a35-993e-00033a81f6d5",
      "Active":true,
      "Alert":"Some alerts for the Person",
      "Comments":"Some comments for the Person",
      "Party":{
        "Id":"291b9f1c-2587-4a35-993e-00033a81f6d5"
      }
    }
  ]
}

我正在使用我的Web Api返回的相同对象进行反序列化,所以我不明白为什么它会失败。 应用$ select时会出现同样的问题。

1 个答案:

答案 0 :(得分:5)

尝试反序列化内容,如下所示:

var content = response.Content.ReadAsAsync<ODataResponse<Person>>();

ODataResponse是:

internal class ODataResponse<T>
{
    public T[] Value { get; set; }
}