使用restsharp反序列化JSON

时间:2014-07-17 20:00:24

标签: c# json deserialization restsharp

我正在尝试从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 ..."
    }
  }
]

2 个答案:

答案 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;
        }
    }
}