RestSharp序列化JSON,对象不使用SerializeAs属性如预期RestSharp序列化

2019-05-12 02:01发布

我使用RestSharp(通过的NuGet 104.4版本)做出一个REST Web服务调用。 我已经设计的一组对象(PO​​CO),其相匹配的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的名称)

我缺少的东西吗?

Answer 1:

这是@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中的所有“小写”使用它们。



Answer 2:

在RestSharp 104.4,缺省JsonSerializer不使用[SerializeAs]属性,通过查看如图源代码 。

一个解决方法是创建一个使用Json.NET自定义序列JsonSerializer (一个很好的例子就是在这里 ),然后与装饰你的属性[JsonProperty]属性,就像这样:

<JsonProperty("email")>
Public Property EmailAddress As String


Answer 3:

RestSharp使用SimpleJson 。 这个库不知道或不尊重[SerializeAs]属性(其是XML只反正 ),它只是输出POCO的属性名称 ,除非它与编译#SIMPLE_JSON_DATACONTRACT定义,那么你可以使用[DataContract]属性重命名属性。

所以,你的选择似乎是重新编译SimpleJson库定义,并与装饰你的属性[DataContract(Name="lowercasepropertyname")]属性,或创建一个使用JSON序列,做尊重其他属性,如提出了一个自定义序列@瑞安的答案。



Answer 4:

我碰到这个问题,这解决了一个稍微不同的方式比上面,想在这里注意它。

我们有一个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;
}

而不是使用AddJsonBodyAddBody方法对抗的要求,这两者导致系列化,我用AddParameter这将增加你在没有经过序列化的对象。 我创建了一个名为方法Serialise ,它使用JSON.net以连载我们班。

private object Serialize<T>(T item)
{
    return JsonConvert.SerializeObject(item);
}

这就允许我们使用JSON.netJsonProperty注释以上的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