.net HttpClient с пользовательским JsonConverter - программирование
Подтвердить что ты не робот

.net HttpClient с пользовательским JsonConverter

Я использую .NET HttpClient для запросов в WebAPI, который возвращает некоторые данные JSON, для которых требуется небольшая пользовательская десериализация на стороне клиента. Для этого я сделал свой собственный JsonConverter, но я не могу понять, как получить метод ReadAsAsync<T>, чтобы найти существование конвертера.

Я решил проблему сейчас, используя ReadAsStringAsync, чтобы прочитать ответ, затем передав эту строку в JsonConvert.DeserializeObject, но похоже, что должно быть более элегантное решение.

Здесь мой код:

public PrefsResponse GetAllPrefs(string sid) {
    HttpClient client = CreateHttpClient(null, sid);
    var response = client.GetAsync("api/sites/" + sid).Result;

    // TODO : find a way to hook custom converters to this...
    // return response.Content.ReadAsAsync<PrefsResponse>().Result;

    var stringResult = response.Content.ReadAsStringAsync().Result;

    return JsonConvert.DeserializeObject<PrefsResponse>(stringResult, new PrefClassJsonConverter());
}

Это лучшее, что я могу сделать, или есть еще более элегантный способ?

Здесь, где я создаю HttpClient, также, если это нужно, чтобы связать его:

        private HttpClient CreateHttpClient(CommandContext ctx, string sid) {
        var cookies = new CookieContainer();

        var handler = new HttpClientHandler {
            CookieContainer = cookies,
            UseCookies = true,
            UseDefaultCredentials = false
        };

        // Add identity cookies:
        if (ctx != null && !ctx.UserExecuting.IsAnonymous) {
            string userName = String.Format("{0} ({1})", ctx.RequestingUser.UserName, ctx.UserExecuting.Key);
            cookies.Add(new Cookie(__userIdCookieName, userName));
            cookies.Add(new Cookie(__sidCookieName, sid));
            cookies.Add(new Cookie(__hashCookieName,
                                   GenerateHash(userName, Prefs.Instance.UrlPrefs.SharedSecret)));
        }

        var client = new HttpClient(handler) {
            BaseAddress = _prefServerBaseUrl
        };

        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));



        return client;
    }
4b9b3361

Ответ 1

Вы можете передать JsonSerializerSettings список ваших преобразователей в JsonMediaTypeFormatter, который будет использоваться ReadAsAsync<T>:

то есть.

var obj = await result.Content.ReadAsAsync<refsResponse>(
    new[] {new JsonMediaTypeFormatter {
          SerializerSettings = new JsonSerializerSettings { 
              Converters = new List<JsonConverter> {
                //list of your converters
               }
             } 
          }
    });

Ответ 2

Возможно, вы хотели бы использовать HttpClient.GetStringAsync Method (String)

var response = client.GetStringAsync("api/sites/" + sid);
return JsonConvert.DeserializeObject<PrefsResponse>(response.Result, new  PrefClassJsonConverter());

Или что именно вы хотите быть более элегантным?

Ответ 3

Мне удалось добавить пользовательский JsonConverter к форматировщикам по умолчанию для HttpClient со следующим:

MediaTypeFormatterCollection formatters = new MediaTypeFormatterCollection(); 
formatters.JsonFormatter.SerializerSettings.Converters.Add(new MyCustomConverter());


var result = response.Content.ReadAsAsync<T>(formatters).Result;

Это, по-видимому, позволяет вам просто добавить свой собственный конвертер к преобразователям по умолчанию.