2017-07-05 222 views
1

我和我的团队正在与OData合作开展一个项目。我们正在尝试使用RestSharp客户端,但无法找到在C#中使用OData的最佳实践的任何干净示例。RestSharp和OData - 问题反序列化JSON

我们遇到的问题是,当试图获取数据时,我们认为它是2层JSON。

private T execRequest<T>(RestClient client, RestRequest request, bool retry = true) 
    { 
     IRestResponse response; 
     T resultdata = default(T); 
     try 
     { 
      response = client.Execute(request); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
     if (response.StatusDescription == "OK") // TAKE CARE OF Session expired or invalid 
     { 
      resultdata = JsonConvert.DeserializeObject<T>(response.Content); 
     } 


     return resultdata; 
    } 

在这个结果,如果我们用一个简单的类型一样的人(ID,激活,激活)我们看到response.content数据。

“{\” @ odata.context \ “:\” http://localhost:56460/ $#元人\”,\ “价值\”:[{\ “ID \”:1090,\ “启动\”:真,“active”:false}]}“

但是resultdata实际上并没有获取数据......它初始化了对象,但ID,启用和激活都是0,false和false。

我们对此是比较新的......我的感觉虽然是因为回应不是100%,json数据可能是问题吗?

(p.s.也在寻找一些与OData和RESTSharp有关的文档)。

编辑:我们认为我们需要反序列化到一个更高级别的对象,因为response.content中的数据是一个对象,然后每个对象说。我们正试图用OData找到一个干净的例子,但还没有。

+0

这是**实际** JSON还是你在VS中看到的? “{\”无效JSON –

+0

嗨,这是我们在检查响应时看到的内容。内容 – melegant

+0

在这种情况下,“T”是什么? – ColinM

回答

0

你是对的:当从OData资源端点检索到一个集合时,实际记录不会被表示为顶层数组。要建立在你的榜样,你要回:

{ 
    "@odata.context":"http://localhost:56460/odata/$metadata#Person", 
    "value": [ 
     { 
     "ID": 1090, 
     "enabled" : true, 
     "active" : false 
     }, 
     { 
     // second Person object, and so on... 
     } 
    ] 
} 

,实际上包含了你的结果是value属性。您可以使用泛型来处理收集结果创建一个简单的包装:

using System.Collections.Generic; 

namespace Api.Models 
{ 
    public class ODataCollectionWrapper<T> where T : class 
    { 
     public IEnumerable<T> Value { get; set; } 
    } 
} 

现在,当您使用RestSharp,你可以调用Execute方法时,指定反序列化类型和保存自己的一些代码。另请注意,RestSharp no longer natively uses Json.NET(尽管您可以管理自己的反序列化并保留Json.NET,如果您真的想的话)。

// RestSharp automatically deserializes to ODataCollectionWrapper<Person> 
response = client.Execute<ODataCollectionWrapper<Person>>(request); 

// Return the actual collection 
return response.Value; // Contains IEnumerable<Person> 

请注意,这是没有必要的,如果你只是获取一个单一的资源(通过ID或者什么具备的,你,什么是保证返回零个或一个结果,而不是一个数组)。