'RestClient'不包含'JsonSerializer'的定义,也没有扩展方法'JsonSerializer'

时间:2017-04-19 03:47:04

标签: c# restsharp

当我阅读readme.txt以获取最新的RestSharp:

*** IMPORTANT CHANGE IN RESTSHARP VERSION 103 ***

In 103.0, JSON.NET was removed as a dependency. 

If this is still installed in your project and no other libraries depend on 
it you may remove it from your installed packages.

There is one breaking change: the default Json*Serializer* is no longer 
compatible with Json.NET. To use Json.NET for serialization, copy the code 
from https://github.com/restsharp/RestSharp/blob/86b31f9adf049d7fb821de8279154f41a17b36f7/RestSharp/Serializers/JsonSerializer.cs 
and register it with your client:

var client = new RestClient();
client.JsonSerializer = new YourCustomSerializer();

The default Json*Deserializer* is mostly compatible, but it does not support
all features which Json.NET has (like the ability to support a custom [JsonConverter]
by decorating a certain property with an attribute). If you need these features, you
must take care of the deserialization yourself to get it working.

我已经使用nu软件包管理器安装了Newtonsoft.Json,我试图将Json.NET注册到客户端变量,但是没有用。这是我的代码:

private void Form1_Load(object sender, EventArgs e)
        {        
            var client = new RestClient("http://homestead.app/vendor");
            client.JsonSerializer = new JsonSerializer(); <-- HERE IS THE ERROR
            var request = new RestRequest("", Method.GET);
            IRestResponse response = client.Execute(request);
            var content = response.Content; // raw content as string
            textBox1.Text = content;
        }

client.JsonSerializer 属性不可用。

请帮助我。感谢

3 个答案:

答案 0 :(得分:2)

RestSharp的序列化程序必须实现两个接口:

  • RestSharp.Serializers.ISerializer
  • RestSharp.Serializers.IDeserializer

您必须将Newtonsoft的序列化程序包装为使用这些接口键入。

我工作的一个项目有工作代码:

/// <summary>
/// Default JSON serializer for request bodies
/// Doesn't currently use the SerializeAs attribute, defers to Newtonsoft's attributes
/// </summary>
/// <remarks>
/// Based on http://blog.patrickmriley.net/2014/02/restsharp-using-jsonnet-serializer.html
/// </remarks>
public class RestSharpJsonNetSerializer : RestSharp.Serializers.ISerializer, RestSharp.Deserializers.IDeserializer
{
    private readonly JsonSerializer serializer;

    /// <summary>
    /// Default serializer
    /// </summary>
    public RestSharpJsonNetSerializer()
    {
        this.ContentType = "application/json";
        this.serializer = new JsonSerializer
        {
            MissingMemberHandling = MissingMemberHandling.Ignore,
            NullValueHandling = NullValueHandling.Include,
            DefaultValueHandling = DefaultValueHandling.Include
        };
    }

    /// <summary>
    /// Default serializer with overload for allowing custom Json.NET settings
    /// </summary>
    public RestSharpJsonNetSerializer(JsonSerializer serializer)
    {
        this.ContentType = "application/json";
        this.serializer = serializer;
    }

    /// <summary>
    /// Unused for JSON Serialization
    /// </summary>
    public string DateFormat { get; set; }

    /// <summary>
    /// Unused for JSON Serialization
    /// </summary>
    public string RootElement { get; set; }

    /// <summary>
    /// Unused for JSON Serialization
    /// </summary>
    public string Namespace { get; set; }

    /// <summary>
    /// Content type for serialized content
    /// </summary>
    public string ContentType { get; set; }

    /// <summary>
    /// Serialize the object as JSON
    /// </summary>
    /// <param name="obj">Object to serialize></param>
    /// <returns>JSON as String</returns>
    public string Serialize(object obj)
    {
        using (var stringWriter = new StringWriter())
        {
            using (var jsonTextWriter = new JsonTextWriter(stringWriter))
            {
                jsonTextWriter.Formatting = Formatting.Indented;
                jsonTextWriter.QuoteChar = '"';

                this.serializer.Serialize(jsonTextWriter, obj);

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

    public T Deserialize<T>(RestSharp.IRestResponse response)
    {
        using (var strReader = new StringReader(response.Content))
        {
            using (var jsonReader = new JsonTextReader(strReader))
            {
                var data = this.serializer.Deserialize<T>(jsonReader);
                return data;
            }
        }
    }
}

答案 1 :(得分:0)

新的readme.txt至少在GitHub中更新,但程序包仍包含旧代码。

所以@TcKs的答案是正确的:

var request = new RestRequest();
request.JsonSerializer = new Shared.JsonSerializer();
var client = new RestClient();
client.Post(request);

答案 2 :(得分:0)

返回时使用mapper对象会很容易

public YourResultBase Login(string username, string password)
        {
            var client = new RestClient("apiUrl");
            var request = new RestRequest(Method.GET)
            {
                OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; }
            };
            request.AddHeader("Cache-Control", "no-cache");
            IRestResponse<YourResultBase> response = client.Execute<YourResultBase>(request);
            var result = response.Data;
            return result;
        }