我创建了一个像这样的小班。
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。