Generate json key as snake_case with RestSharp

Viewed 216

Any idea how to generate json key as snake_case with RestSharp?

With Newtonsoft.Json, I can set json output something like this

  DefaultContractResolver contractResolver = new DefaultContractResolver
            {
                NamingStrategy = new SnakeCaseNamingStrategy()
            };

            string json = JsonConvert.SerializeObject(requestData, new JsonSerializerSettings
            {
                ContractResolver = contractResolver,
                Formatting = Formatting.Indented
            });

But I not sure how can be done with RestSharp

var client = new RestClient(getService.MstUrl);

            client.AddDefaultHeader("Authorization", string.Format("Bearer {0}", token));

            var request = new RestRequest(Method.POST).AddJsonBody(requestData);          

            var response = await client.ExecuteAsync(request);

It keep generate as camelCase. Is there any configuration like Newtonsoft.Json?

2 Answers

Using RestSharp, does not mean you can't use the Newtonsoft serializer as well.

From the restsharp documentation:

RestSharp support Json.Net serializer via a separate package. You can install it from NuGet.

client.UseNewtonsoftJson();

And keep on going with what you did:

DefaultContractResolver contractResolver = new DefaultContractResolver
{
    NamingStrategy = new SnakeCaseNamingStrategy()
};

You should be able to create your own IRestSerializer implementation and supply that in client.UseSerializer

Given

public class SimpleJsonSerializer : IRestSerializer
{
   private readonly DefaultContractResolver _contractResolver;

   public SimpleJsonSerializer()
   {
      _contractResolver = new DefaultContractResolver
      {
         NamingStrategy = new SnakeCaseNamingStrategy()
      };   
   }
   public string Serialize(object obj) => JsonConvert.SerializeObject(obj, new JsonSerializerSettings
   {
      ContractResolver = _contractResolver,
      Formatting = Formatting.Indented
   });

   public string Serialize(Parameter bodyParameter) => Serialize(bodyParameter.Value);

   public T Deserialize<T>(IRestResponse response) => JsonConvert.DeserializeObject<T>(response.Content);

   public string[] SupportedContentTypes { get; } =
   {
      "application/json", "text/json", "text/x-json", "text/javascript", "*+json"
   };

   public string ContentType { get; set; } = "application/json";

   public DataFormat DataFormat { get; } = DataFormat.Json;
}

Usage

var client = new RestClient(getService.MstUrl);

client.AddDefaultHeader("Authorization", string.Format("Bearer {0}", token));
client.UseSerializer(() => new SimpleJsonSerializer(){});

var request = new RestRequest(Method.POST).AddJsonBody(requestData);

var response = await client.ExecuteAsync(request);

Disclaimer : I haven't used RestSharp in years and I never intend to use it again. Further more, I really do suggest to anyone thinking of using it to switch back to HttpClient, or even better IHttpClientFactory. More so, this is completely untested, and only given as an example. You may need to modify it to it your needs

Related