我正在尝试从Harvest反序列化数据,但它失败了(没有错误):https://github.com/harvesthq/api#api-json
返回的数据如下所示:
更新 (请参阅底部的完整JSON响应)
当我运行以下代码时的输出是一个包含x个帖子的列表,其中每个帖子包含一个id = 0
是否有一个设置或某些东西让我忽略/解析周围的[]?
[DeserializeAs(Name = "project")]
public class Project
{
public int id { get; set; }
//public string name { get; set; }
//[DeserializeAs(Name = "created-at")]
//public DateTime CreatedAt { get; set; }
}
// The following is the methods to request for testing
public List<Project> GetProjects()
{
var request = new RestRequest("projects", Method.GET);
request.RequestFormat = DataFormat.Json;
return Execute<List<Project>>(request);
}
private T Execute<T>(RestRequest request) where T : new()
{
var client = new RestClient();
client.BaseUrl = BaseUrl;
client.Authenticator = new HttpBasicAuthenticator(_username, _password);
var response = client.Execute<T>(request);
if (response.ErrorException != null)
{
const string message = "Error retrieving response. Check inner details for more info.";
var exception = new ApplicationException(message, response.ErrorException);
throw exception;
}
return response.Data;
}
Harvest收到的数据:
[
{
"project": {
"id": 123456,
"client_id": 219854,
"name": "Test proj 1",
"code": "",
"active": false,
"billable": true,
"bill_by": "Tasks",
"cost_budget": null,
"cost_budget_include_expenses": false,
"hourly_rate": null,
"budget": 8,
"budget_by": "project",
"notify_when_over_budget": false,
"over_budget_notification_percentage": 80,
"over_budget_notified_at": null,
"show_budget_to_all": false,
"created_at": "2014-04-03T09:49:00Z",
"updated_at": "2014-07-02T11:45:07Z",
"estimate": 8,
"estimate_by": "project",
"hint_earliest_record_at": "2014-04-03",
"hint_latest_record_at": "2014-04-03",
"notes": ""
}
},
{
"project": {
"id": 234567,
"client_id": 686547,
"name": "Test porj 2",
"code": "",
"active": true,
"billable": true,
"bill_by": "Tasks",
"cost_budget": null,
"cost_budget_include_expenses": false,
"hourly_rate": null,
"budget": 8,
"budget_by": "project",
"notify_when_over_budget": false,
"over_budget_notification_percentage": 80,
"over_budget_notified_at": null,
"show_budget_to_all": false,
"created_at": "2014-04-03T09:48:28Z",
"updated_at": "2014-04-15T20:47:29Z",
"estimate": 8,
"estimate_by": "project",
"hint_earliest_record_at": "2014-04-03",
"hint_latest_record_at": "2014-04-03",
"notes": ""
}
},
{
"project": {
"id": 345678,
"client_id": 987456,
"name": "Test proj 3",
"code": "",
"active": false,
"billable": true,
"bill_by": "Project",
"cost_budget": null,
"cost_budget_include_expenses": false,
"hourly_rate": null,
"budget": 8,
"budget_by": "project",
"notify_when_over_budget": false,
"over_budget_notification_percentage": 80,
"over_budget_notified_at": null,
"show_budget_to_all": false,
"created_at": "2013-04-26T13:21:35Z",
"updated_at": "2014-03-30T18:05:24Z",
"estimate": 8,
"estimate_by": "project",
"hint_earliest_record_at": "2013-04-26",
"hint_latest_record_at": "2013-12-04",
"notes": "Scriblings from meeting ..."
}
}
]
答案 0 :(得分:5)
您误解了JSON响应。
[
{
"project": {
"id": 123456
}
},
{
"project": {
"id": 234567
}
}
]
这是一个包含Project
的对象的数组。我不熟悉RestSharp,但是这样的事情应该这样做:
public class SomeType
{
public Project project { get; set; }
}
return Execute<List<SomeType>>(request);
您可能希望与项目维护人员取得联系,但the documentation /projects
应该返回一系列项目。
答案 1 :(得分:4)
正如Stijn所说,你的服务正在返回一个容器对象的数组,其中包含一个类型为project的属性。
我冒昧地使用Stijn建议的修复重新创建您的代码示例。请参阅下文。
using RestSharp;
using RestSharp.Deserializers;
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Program p = new Program();
var project = p.GetProjects();
}
public class ProjectResult
{
public Project project { get; set; }
}
public class Project
{
public int id { get; set; }
}
public List<ProjectResult> GetProjects()
{
var request = new RestRequest("projects", Method.GET);
request.RequestFormat = DataFormat.Json;
return Execute<List<ProjectResult>>(request);
}
private T Execute<T>(RestRequest request) where T : new()
{
var client = new RestClient();
client.BaseUrl = "http://127.0.0.1:1337/";
//client.Authenticator = new HttpBasicAuthenticator(_username, _password);
var response = client.Execute<T>(request);
if (response.ErrorException != null)
{
const string message = "Error retrieving response. Check inner details for more info.";
var exception = new ApplicationException(message, response.ErrorException);
throw exception;
}
return response.Data;
}
}
}