我使用RestSharp(通过的NuGet 104.4版本)做出一个REST Web服务调用。 我已经设计的一组对象(POCO),其相匹配的API暴露资源。 然而,我的对象的属性名称不匹配发布数据时通过REST服务期望,所以我想“改造”他们,当我提出一个请求到REST服务,以使它们相匹配的匹配。 我读了加入SerializeAs
我POCO的财产属性(指定名称)将会使他们正确地序列,但它不会。
我的POCO
Imports RestSharp.Serializers
<Serializable(), SerializeAs(Name:="ApiMember")>
Public Class ApiMember
<SerializeAs(Name:="id")>
Public Property Id As Integer?
<SerializeAs(Name:="email")>
Public Property EmailAddress As String
<SerializeAs(Name:="firstname")>
Public Property Firstname As String
<SerializeAs(Name:="lastname")>
Public Property Lastname As String
End Class
我打电话给API
Dim request As RestRequest = New RestRequest(Method.POST)
Dim member As ApiMember = new ApiMember()
member.EmailAddress = "me@example.com"
request.Resource = "members"
request.RequestFormat = DataFormat.Json
request.AddBody(member)
Dim client As RestClient = New RestClient()
client.BaseUrl = "http://url.com"
client.Authenticator = New HttpBasicAuthenticator("username", "password")
client.Execute(Of ApiGenericResponse)(request)
什么最终被公布
{"Id":null,"EmailAddress":"me@example.com","Firstname":null,"Lastname":null}
注意属性的名称不匹配指定放入系统我SerializeAs
(转换为大写,EmailAddress的名称)
我缺少的东西吗?
这是@MaxiWheat和任何人在如何使用JSON.NET如在RestSharp请求JSON序列化的兴致。 基本上,我用描述的方法由帕特里克·赖利这篇博客文章 :
// create the request
var request = new RestRequest(yourUrlHere, Method.POST) { RequestFormat = DataFormat.Json };
// attach the JSON.NET serializer for RestSharp
restRequest.JsonSerializer = new RestSharpJsonNetSerializer();
而RestSharpJsonNetSerializer
从JSON.NET家伙(约翰·希恩)一个实现(小于100行代码) 可以在他们的Github上的网页中找到
有了这个设置,我的问题走了,我能有一个正确的DTO漂亮驼峰特性,而序列化JSON中的所有“小写”使用它们。
在RestSharp 104.4,缺省JsonSerializer
不使用[SerializeAs]
属性,通过查看如图源代码 。
一个解决方法是创建一个使用Json.NET自定义序列JsonSerializer
(一个很好的例子就是在这里 ),然后与装饰你的属性[JsonProperty]
属性,就像这样:
<JsonProperty("email")>
Public Property EmailAddress As String
RestSharp使用SimpleJson 。 这个库不知道或不尊重[SerializeAs]
属性(其是XML只反正 ),它只是输出POCO的属性名称 ,除非它与编译#SIMPLE_JSON_DATACONTRACT
定义,那么你可以使用[DataContract]
属性重命名属性。
所以,你的选择似乎是重新编译SimpleJson库定义,并与装饰你的属性[DataContract(Name="lowercasepropertyname")]
属性,或创建一个使用JSON序列,做尊重其他属性,如提出了一个自定义序列@瑞安的答案。
我碰到这个问题,这解决了一个稍微不同的方式比上面,想在这里注意它。
我们有一个factory
类,建立我们所有的请求。 如下所示
public IRestRequest CreatePutRequest<TBody>(string resource, TBody body)
{
var request = new RestRequest(resource)
{
Method = Method.PUT,
};
request.AddParameter("application/json", Serialize(body), ParameterType.RequestBody);
return request;
}
而不是使用AddJsonBody
和AddBody
方法对抗的要求,这两者导致系列化,我用AddParameter
这将增加你在没有经过序列化的对象。 我创建了一个名为方法Serialise
,它使用JSON.net
以连载我们班。
private object Serialize<T>(T item)
{
return JsonConvert.SerializeObject(item);
}
这就允许我们使用JSON.net
的JsonProperty
注释以上的propertys。 下面是一个例子 -
public class Example
{
[JsonProperty(PropertyName = "name")]
public string Name { get; set; }
[JsonProperty(PropertyName = "created")]
public DateTime Created { get; set; }
[JsonProperty(PropertyName = "updated")]
public DateTime Updated { get; set; }
}
文章来源: RestSharp serialization to JSON, object is not using SerializeAs attribute as expected