简体   繁体   English

获取用于反序列化响应的RestSharp反序列化器

[英]Get RestSharp deserializator used for deserializing response

When I make call using ressharp 当我使用ressharp拨打电话时

response = client.Execute<SomeClass>(request);

I need to know which deserializer restsharp used inside to deserialize this responce. 我需要知道里面使用哪个deserializer restsharp来反序列化这个响应。 I know that restsharp determine deserializer based on the Content Type returned by the server. 我知道restsharp会根据服务器返回的内容类型确定反序列化程序。

I need something like this 我需要这样的东西

var deserializator = responce.GetUsedDeserializator();

or even 甚至

var deserializator = restclient.GetDeserializatorForContentType(responce.ContentType)

Thereisn't simple way to do it.The only way I found is extracting restsharp source code. 这不是简单的方法。我找到的唯一方法是提取restsharp源代码。

public static class RestSharpExtensions
{
    private static readonly Regex structuredSyntaxSuffixRegex = new Regex("\\+\\w+$", RegexOptions.Compiled);

    private static Dictionary<string, IDeserializer> contentTypeToDeserializerMap = new Dictionary
        <string, IDeserializer>
    {
        {"application/json", new JsonDeserializer()},
        {"application/xml", new XmlDeserializer()},
        {"text/json", new JsonDeserializer()},
        {"text/x-json", new JsonDeserializer()},
        {"text/javascript", new JsonDeserializer()},
        {"text/xml", new XmlDeserializer()},
        {"*+json",  new JsonDeserializer()},
        {"*+xml", new XmlDeserializer()},
        {"*",  new XmlDeserializer()}
    };


    public static IDeserializer GetDeserializer(this IRestResponse restResponse)
    {
        var contentType = restResponse.ContentType;
        if (contentType == null)
            throw new ArgumentNullException("contentType");
        if (string.IsNullOrEmpty(contentType) && contentTypeToDeserializerMap.ContainsKey("*"))
            return contentTypeToDeserializerMap["*"];
        int length = contentType.IndexOf(';');
        if (length > -1)
            contentType = contentType.Substring(0, length);
        if (contentTypeToDeserializerMap.ContainsKey(contentType))
            return contentTypeToDeserializerMap[contentType];
        Match match = structuredSyntaxSuffixRegex.Match(contentType);
        if (match.Success)
        {
            string key = "*" + match.Value;
            if (contentTypeToDeserializerMap.ContainsKey(key))
                return contentTypeToDeserializerMap[key];
        }
        if (contentTypeToDeserializerMap.ContainsKey("*"))
            return contentTypeToDeserializerMap["*"];
        return (IDeserializer)null;
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM