简体   繁体   English

使用restsharp反序列化JSON

[英]Deserialize JSON using restsharp

I am trying to deserialize data from Harvest but its failing (no error): https://github.com/harvesthq/api#api-json 我试图从Harvest反序列化数据,但它失败了(没有错误): https//github.com/harvesthq/api#api-json

The data returned looks like this: 返回的数据如下所示:

Updated (see at the bottom for complete JSON response) 更新 (请参阅底部的完整JSON响应)

The output when i run the code below is a list with x posts where each post contains an id = 0 我运行下面代码时的输出是一个带有x个帖子的列表,其中每个帖子包含一个id = 0

Is there a setting or something that i have missed to make it ignore/parse the surrounding []? 是否有一个设置或我错过的东西让它忽略/解析周围的[]?

[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;
}

Data returned from Harvest: 从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 ..."
    }
  }
]

You're misinterpreting the JSON response. 你错误地解释了JSON响应。

[
  {
    "project": {
      "id": 123456
    }
  },
  {
    "project": {
      "id": 234567
    }
  }
]

That's an array with objects that contain a Project . 这是一个包含Project对象的数组。 I'm not familiar with RestSharp, but something like this should do: 我不熟悉RestSharp,但这样的事情应该做:

public class SomeType
{
    public Project project { get; set; }
}
return Execute<List<SomeType>>(request);

You might want to get in touch with the project maintainers though, according to the documentation /projects should return an array of projects. 您可能希望与项目维护人员取得联系,但根据文档 /projects应返回一系列项目。

As Stijn mentioned your service is returning an array of a container object with a property of the type project. 正如Stijn所提到的,您的服务正在返回一个容器对象的数组,该容器对象具有类型为project的属性。

I took the liberty to recreate your code sample with the fix suggested by Stijn see it below. 我冒昧地使用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;
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM