RestSharp在camelCase中序列化JSON

时间:2015-09-30 13:53:38

标签: json restsharp simplejson camelcasing

我想在camelCase中发布JSON,并按照这里的说明进行操作:

https://github.com/restsharp/RestSharp/wiki/Deserialization#overriding-jsonserializationstrategy

public class CamelCaseSerializerStrategy : PocoJsonSerializerStrategy
{
    protected override string MapClrMemberNameToJsonFieldName(string clrPropertyName)
    {
    return char.ToLower(clrPropertyName[0]) + clrPropertyName.Substring(1);
    }
}

然后我用这段代码创建一个新客户端:

var client = new RestClient(_baseUrl);
SimpleJson.CurrentJsonSerializerStrategy = new CamelCaseSerializerStrategy();

但是,在发出请求时,串行器未激活。 RestSharp文档遍布整个地方,并且大部分都是错误的。查看源代码(RestRequest.AddBody),看起来根本不会使用SerializerStrategy。

我一直在寻找一种在客户端级别进行此更改的方法,或者某些不需要修改每个请求的方法。

我已经看过this blog - 也许这是唯一的方法。如果您只能在请求级别更改序列化策略,那么对于RestSharp来说似乎是一个巨大的退步。

7 个答案:

答案 0 :(得分:9)

我遇到了同样的问题。幸运的是,我设法按照here提供的说明解决了这个问题。

基本上,对于每个请求,您必须将JsonSerializer设置为NewtonsoftJsonSerializer。例如:

var request = new RestRequest();
request.JsonSerializer = new NewtonsoftJsonSerializer();

以下NewtonsoftJsonSerializer的来源:


public NewtonsoftJsonSerializer()
{
     ContentType = "application/json";
     _serializer = new JsonSerializer
     {
          MissingMemberHandling = MissingMemberHandling.Ignore,
          NullValueHandling = NullValueHandling.Include,
          DefaultValueHandling = DefaultValueHandling.Include
     };
}

public NewtonsoftJsonSerializer(JsonSerializer serializer)
{
     ContentType = "application/json";
     _serializer = serializer;
}


public string Serialize(object obj)
{
     using (var stringWriter = new StringWriter())
     {
         using (var jsonTextWriter = new JsonTextWriter(stringWriter))
         {
             jsonTextWriter.Formatting = Formatting.Indented;
             jsonTextWriter.QuoteChar = '"';

             _serializer.Serialize(jsonTextWriter, obj);

             var result = stringWriter.ToString();
             return result;
          }
     }
}

    public string DateFormat { get; set; }
    public string RootElement { get; set; }
    public string Namespace { get; set; }
    public string ContentType { get; set; }
}

希望它能解决你的问题!

答案 1 :(得分:3)

我使用RestSharp 105.2.3,RestSharp wiki提出的解决方案对我来说很好。我已经尝试在创建RestClient实例之前和之后将我的策略对象分配给SimpleJson.CurrentJsonSerializerStrategy属性,两种方式都有效。

可能你的问题出在其他地方。

答案 2 :(得分:2)

RestSharp.Serializers.NewtonsoftJson

dotnet添加软件包RestSharp.Serializers.NewtonsoftJson

Manage Nuget Package

然后

using RestSharp.Serializers.NewtonsoftJson;
...
public myRestSharpMethod() {

   ... 

   var client = new RestClient(url);

   client.UseNewtonsoftJson();

   // code continues..
}

希望有帮助!

答案 3 :(得分:1)

使用Alex Che的链接解决了大部分问题。如果你想要一切都是小写,你可能仍然有一些麻烦。这是一个例子:

using System.Linq;
using RestSharp;

public class Demo
{
    public IRestResponse<ExampleOutputDto> ExecuteDemo()
    {
        // Convert casing
        SimpleJson.CurrentJsonSerializerStrategy = new SnakeJsonSerializerStrategy();

        const string uri = "http://foo.bar/";
        const string path = "demo";
        var inputDto = new ExampleInputDto
        {
            FooBar = "foobar",
            Foo = "foo"
        };

        var client = new RestClient(uri);
        var request = new RestRequest(uri, Method.POST)
            .AddJsonBody(inputDto);
        return client.Execute<ExampleOutputDto>(request);
    }
}

public class ExampleInputDto
{
    public string FooBar { get; set; }
    public string Foo { get; set; }
}

public class ExampleOutputDto
{
    public string Response { get; set; }
}

/// <summary>
/// Credit to https://github.com/restsharp/RestSharp/wiki/Deserialization#overriding-jsonserializationstrategy
/// </summary>
public class SnakeJsonSerializerStrategy : PocoJsonSerializerStrategy
{
    protected override string MapClrMemberNameToJsonFieldName(string clrPropertyName)
    {
        //PascalCase to snake_case
        return string.Concat(clrPropertyName.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + char.ToLower(x).ToString() : char.ToLower(x).ToString()));
    }
}

在此示例中,FooBar将转换为foo_barFoo将转换为Foo。此外,响应将被正确反序列化,即response将转换为Response

答案 4 :(得分:0)

订单似乎并不重要。我试图做同样的事,没有快乐。

虽然你不能在更全局的层面上覆盖序列化器和反序列化器(或者通过配置)而不必为RestRequest对象敲掉某种包装器,但这似乎很奇怪。必须根据每个请求进行设置(特别是当您执行大量请求时)似乎只是在寻找麻烦。

答案 5 :(得分:0)

使用PocoJsonSerializerStrategy作为新类的基础

internal class CamelCaseJsonSerializerStrategy : PocoJsonSerializerStrategy
    {
        protected override string MapClrMemberNameToJsonFieldName(string clrPropertyName)
        {
            if (clrPropertyName.Count() >= 2)
            {
                return char.ToLower(clrPropertyName[0]).ToString() + clrPropertyName.Substring(1);
            }
            else
            {
                //Single char name e.g Property.X
                return clrPropertyName.ToLower();
            }
        }
    }

答案 6 :(得分:0)

使用Restsharp v107.0或更高版本

RestSharp已决定在v107.0版本中恢复对Newtonsoft.JSON的支持,因此您可以使用以下方式将Restsharp设置为将newtonsoft.JSON与camelCase结合使用:

发送代码:

var restSharpClient = new RestClient("https://my.api.com")
                .UseSerializer(new JsonNetSerializer());

var request = new Company();
request.CompanyName = "ACME";

var restSharpRequest = new RestSharp.RestRequest("client", RestSharp.Method.POST);

restSharpRequest.AddJsonBody(request);

var restSharpResponse = restSharpClient.Execute(restSharpRequest);

序列化器:

private class JsonNetSerializer : RestSharp.Serialization.IRestSerializer
{
    public string Serialize(object obj) =>
        Newtonsoft.Json.JsonConvert.SerializeObject(obj);

    public string Serialize(Parameter parameter) =>
        Newtonsoft.Json.JsonConvert.SerializeObject(parameter.Value);

    public T Deserialize<T>(RestSharp.IRestResponse response) =>
        Newtonsoft.Json.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 RestSharp.DataFormat DataFormat { get; } = RestSharp.DataFormat.Json;
}

请求类:

using Newtonsoft.Json;

public class Company {
    [JsonProperty("companyName")]
    public String CompanyName { get; set; }
}

参考:https://github.com/restsharp/RestSharp/wiki/Serialization

使用Restsharp v106.0或更旧版本

您可以使用以下库:https://github.com/adamfisher/RestSharp.Serializers.Newtonsoft.Json 并在每个请求之前设置序列化器