RestSharp not deserializing JSON correctly
Solved using Custom JSON Serializer
and Deserializer
, in the case Newtonsoft's JSON.NET.
I followed the steps explained in this article by Philipp Wagner.
I also noticed that the serialization of a Request
using the default Serializer
didn't work as expected with enums. Instead of serializing the enum string value, it places the enum int value, taken from my enum definition.
With JSON.NET now the serialization and deserialization processes works correctly.
Cheshire Cat
I'm interested in several programming languages and techiniques. The most relevant are: C#, .NET Core, .NET 5, ASP.NET (Web Forms and MVC), HTML5, CSS3, JavaScript, jQuery, LINQ, SQL. I'm also a GIS expert and I've some knowledge about: ArcGIS Desktop, GeoMedia, QGIS, OpenStreetMap, Spatial Data and Spatial Analysis in general.
Updated on June 15, 2022Comments
-
Cheshire Cat almost 2 years
I'm using RestSharp to consume a REST Web Service. I've implemented my own Response object classes to use with automatic Serialization/Deserialization integrated inside RestSharp.
I've also added a mappging with enums that works correctly.
The problem with this class is that when I send a correct request I get back a correct response, so the Response.Content contains what I expect, but the Deserialization process doesn't work correctly.
Response.Content
{ "resultCode": "SUCCESS", "hub.sessionId": "95864537-4a92-4fb7-8f6e-7880ce655d86" }
The
ResultCode
property is correct mapped toResultCode.SUCCESS
enum value but theHubSessionId
property is alwaysnull
so it seems like it is not deserialized.The only possible problem I see is the JSON PropertyName with a '.' in the name. Can it be the problem? Is this related to the new JSON Serializer that isn't Newtonsoft.Json no more? How can I solve it?
UPDATE
I found that the Json Attributes are completly ignored, and so also the
[JsonConverter(typeof(StringEnumConverter))]
. Therefore I think that the enum mapping is performed automatically by the default Serializer without any attribute. The problem with "hub.sessionId" property still remains.This is my code
public class LoginResponse { [JsonProperty(PropertyName = "resultCode")] [JsonConverter(typeof(StringEnumConverter))] public ResultCode ResultCode { get; set; } [JsonProperty(PropertyName = "hub.sessionId")] public string HubSessionId { get; set; } } public enum ResultCode { SUCCESS, FAILURE } // Executes the request and deserialize the JSON to the corresponding // Response object type. private T Execute<T>(RestRequest request) where T : new() { RestClient client = new RestClient(BaseUrl); request.RequestFormat = DataFormat.Json; IRestResponse<T> response = client.Execute<T>(request); if (response.ErrorException != null) { const string message = "Error!"; throw new ApplicationException(message, response.ErrorException); } return response.Data; } public LoginResponse Login() { RestRequest request = new RestRequest(Method.POST); request.Resource = "login"; request.AddParameter("username", Username, ParameterType.GetOrPost); request.AddParameter("password", Password, ParameterType.GetOrPost); LoginResponse response = Execute<LoginResponse>(request); HubSessionId = response.HubSessionId; // Always null! return response; }