RestSharp sérialisation à JSON, l'objet n'utilise pas l'attribut SerializeAs comme prévu
Je suis en utilisant RestSharp (version 104.4 via NuGet) pour effectuer des appels vers un Service Web Rest. J'ai conçu un ensemble d'objets (POCO) ce qui correspond à des ressources exposées dans l'API. Cependant, mes objets de propriété noms ne correspondent pas à ceux attendus par le Reste du Service lors de la publication des données, donc je voudrais à "transformer" quand je fais une demande pour le service de Repos pour les faire correspondre à celle. J'ai lu que l'ajout de SerializeAs
attribut (avec un Nom spécifié) sur mon POCO de la propriété de faire sérialiser correctement, mais il ne sera pas.
Ma 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
Mon Appel à l'API
Dim request As RestRequest = New RestRequest(Method.POST)
Dim member As ApiMember = new ApiMember()
member.EmailAddress = "[email protected]"
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)
Ce qui finit par être publié
{"Id":null,"EmailAddress":"[email protected]","Firstname":null,"Lastname":null}
Notez le nom de l'propriétés ne correspondent pas à celles que j'ai précisé dans SerializeAs
(majuscules, le nom de votre Adresse de courrier électronique)
Suis-je raté quelque chose ?
source d'informationauteur MaxiWheat
Vous devez vous connecter pour publier un commentaire.
C'est pour @MaxiWheat et toute autre personne intéressée à l'utilisation JSON.NET comme le sérialiseur JSON dans un RestSharp demande. En gros, j'ai utilisé la méthode décrite dans ce post de blog de Patrick Riley:
et la
RestSharpJsonNetSerializer
est une mise en œuvre (moins de 100 lignes de code) à partir de la JSON.NET les gars (John Sheehan) que peut être trouvé sur leur Github pagesAvec cette configuration, mes problèmes ont disparu et j'ai pu avoir un bon DTO avec de belles CamelCase propriétés, tandis que le JSON sérialisé les utilise dans tous les "minuscules".
Dans RestSharp 104.4, la valeur par défaut
JsonSerializer
ne pas utiliser le[SerializeAs]
attribut, comme on le voit par l'examen de la le code source.Une solution de contournement consiste à créer un processus qui utilise le Json.NET
JsonSerializer
(un bon exemple est ici), puis les décorer vos propriétés avec le[JsonProperty]
attribut, comme suit:RestSharp utilise SimpleJson. Cette bibliothèque ne sais pas ou le respect de la
[SerializeAs]
attribut (qui est XML-seulement de toute façon), c'est juste les sorties de l'POCO du nom de la propriétésauf s'il est compilé avec#SIMPLE_JSON_DATACONTRACT
défini, vous pouvez utiliser le[DataContract]
attribut de renommer propriétés.Afin que vos options semblent être à recompiler le SimpleJson bibliothèque avec qui définissent et décorer vos propriétés avec le
[DataContract(Name="lowercasepropertyname")]
attribut, ou de créer un processus qui utilise un sérialiseur JSON qui ne l'égard d'autres attributs comme le suggère @Ryan réponse.Je suis tombé sur ce problème, et résolu ce problème d'une manière légèrement différente de ci-dessus, tient à souligner ici.
Nous avons un
factory
classe qui construit l'ensemble de nos demandes. Se présente comme suitPlutôt que d'utiliser le
AddJsonBody
etAddBody
méthodes à l'encontre de la demande, en plus de provoquer de la sérialisation, j'ai utiliséAddParameter
qui va ajouter de l'objet que vous transmettez sans sérialisation. J'ai créé une méthode appeléeSerialise
qui utiliseJSON.net
à serialise notre classe.Ensuite, cela nous permet d'utiliser
JSON.net
'sJsonProperty
annotation au-dessus de votre propertys. Voici un exemple -