仅使用RestSharp将对象转换为json

时间:2017-03-09 22:44:18

标签: c# post restsharp

我创建了一个像这样的小班。

public class Device
    {
        public Device()
        {
        }

        [DeserializeAs(Name = "u_friendly_name")]
        //[SerializeAs(Name = "u_friendly_name")]
        public string Name { get; set; }
    }
}

为了映射"名称" to" u_friendly_name" (因为它应该在json中)我已经添加了DeserializeAs声明。我的第一个问题是..如果我想要POST / GET json或者DeserializeAs就足够了,我是否需要DeserializeAs和SerializeAs?

像这样做GET非常有效。它会自动管理获取json并根据需要将其转换为设备。但是,做一个POST并不是那么简单......

public Device GetDevice(string guid)
{
    var request = new RestRequest("api/now/table/x_device", Method.GET);
    request.RootElement = "result";

    var devices = client.Execute<List<Device>>(request);
    return devices.Data.FirstOrDefault(d => d.Guid == guid);
}

我试图像这样做一个POST。

        public void RegisterDevice()
        {
            Device device = new Device();
            device.Name = Environment.MachineName;

            var request = new RestRequest("api/now/table/x_device", Method.POST);
            request.RequestFormat = DataFormat.Json;
            request.AddBody(device); // HERE

            Console.WriteLine(request.Parameters[0]);

            var response = client.Execute(request);
        }

问题是该对象没有被翻译成json。而不是拥有&#34; u_friendly_name&#34;在json输出中,我看到&#34; Name&#34;。我知道这可以使用Json.Net来解决,例如:

string json = JsonConvert.SerializeObject(device);

但是这也需要我为我的项目添加另一个依赖项并将JsonProperty声明添加到我的类中。我已经能够使用Json.NET进行POST,但不能使用GET,反之亦然。

任何能指出我如何使用(最好)只使用RestSharp序列化我的课程的正确方向的人?

编辑:在阅读了stackoverflow上的大量帖子后,我得到的印象是RestSharp不适合反序列化。我找到了以下使用自定义json序列化程序的链接,虽然POST工作得很好,但我不确定我在GET上做错了什么:http://bytefish.de/blog/restsharp_custom_json_serializer/

public Device GetDevice(string guid)
{
    var request = new RestRequest("api/now/table/x_device", Method.GET);
    request.RequestFormat = DataFormat.Json;
    request.JsonSerializer = NewtonsoftJsonSerializer.Default;
    request.RootElement = "result";

    var devices = client.Execute<List<Device>>(request);
    return devices.Data.FirstOrDefault(d => d.Guid == guid);
}

唯一有效的方法是同时设置:

[JsonProperty(PropertyName = "u_friendly_name")]
[DeserializeAs(Name = "u_friendly_name")]

但我希望这不是必要的吗?

Edit2:我已经通过添加&#34; AddHandlers&#34;来管理POST工作。如上面的博客文章中提到的RestSharp客户端。我也改变了我的课程并添加了一个&#34;设备&#34;定义

public class Devices
{
    [JsonProperty(PropertyName = "result")]
    public List<Device> devices { get; set; }
}

public class Device
    {
        public Device()
        {
        }

        [DeserializeAs(Name = "u_friendly_name")]
        //[SerializeAs(Name = "u_friendly_name")]
        public string Name { get; set; }
    }
}

现在我的功能看起来像这样并按预期工作:

public Device GetDevice(string guid)
{
    var request = new RestRequest("api/now/table/x_uia_sdm_device", Method.GET);
    request.RequestFormat = DataFormat.Json;
    request.JsonSerializer = NewtonsoftJsonSerializer.Default;

    IRestResponse response = client.Execute(request);
    var deviceList = JsonConvert.DeserializeObject<Devices>(response.Content);
    return deviceList.devices.FirstOrDefault(d => d.Guid == guid);
}

JSON:

{
  "result": [
    {
      "u_guid": "12345678",
      "u_friendly_name": "DeviceA",
      "sys_mod_count": "1",
      "sys_updated_on": "2017-03-09 11:58:50",
      "sys_tags": "",
      "u_config_override": "log_level_local = 5",
      "u_running_version": "1.0.0",
      "sys_id": "abcdefg",
      "sys_created_on": "2017-03-07 12:25:06",
      "u_reference_record": "",
      "u_status": "Provisioned",
      "sys_created_by": "foo@bar.no"
    },
    {
      "u_guid": "34567890",
      "u_friendly_name": "DeviceB",
      "sys_mod_count": "0",
      "sys_updated_on": "2017-03-08 13:23:06",
      "sys_tags": "",
      "u_config_override": "",
      "u_running_version": "",
      "sys_id": "abcdefg",
      "u_application": "",
      "u_reference_record": "",
      "u_status": "",
      "sys_created_by": "foo@bar.no"
    }
  ]
}

即使它现在有效,我的初步问题仍然存在。如果可能的话,我希望删除Json.Net并仅使用RestSharp。

0 个答案:

没有答案