Самый эффективный способ анализа ответа JSend в ядре asp.net - PullRequest
0 голосов
/ 10 октября 2018

Я разработал вспомогательный класс, который считывает возврат вызова REST, который реализует шаблон JSend в моем приложении ASP.Net Core 2.1 C #.В настоящее время я использую JObject.Parse (data) для генерации JObject , а затем использую метод SelectToken для чтения статуса , свойства и data , чтобы проанализировать возвращенный json и вызвать ошибку или вернуть свойство data, если все прошло хорошо.

private static string GetReturn(string data)
{
    if (!string.IsNullOrWhiteSpace(data))
    {
        var respostaJson = JObject.Parse(data);
        var statusToken = respostaJson.SelectToken("status");
        if (!(statusToken is null))
        {
            var status = statusToken is null ? string.Empty : statusToken.Value<string>();
            if (status == "success")
            {
                var dataToken = respostaJson.SelectToken("data");
                var dataStr = dataToken is null ? string.Empty : dataToken.Value<string>();
                return dataStr;
            }
            else
                throw new Exception($"Return incorrect for a sucess '{data}'");
        }
        else
            return data;
    }
    else
        return string.Empty;
}

private static void HandleError(string data)
{
    if (!string.IsNullOrWhiteSpace(data))
    {
        var respostaJson = JObject.Parse(data);
        var statusToken = respostaJson.SelectToken("status");
        var status = statusToken is null ? string.Empty : statusToken.Value<string>();
        if (status == "success")
        {
            throw new Exception($"Shouldn't call HandleError on sucess '{data}'");
        }
        else
        {
            var erroToken = respostaJson.SelectToken("error.data");
            var erro = erroToken is null ? string.Empty : erroToken.Value<string>();
            if (string.IsNullOrWhiteSpace(erro))
            {
                erroToken = respostaJson.SelectToken("error.message");
                erro = erroToken is null ? string.Empty : erroToken.Value<string>();
            }
            if (string.IsNullOrWhiteSpace(erro))
            {
                erroToken = respostaJson.SelectToken("message");
                erro = erroToken is null ? string.Empty : erroToken.Value<string>();
            }
            if (string.IsNullOrWhiteSpace(erro))
            {
                erroToken = respostaJson.SelectToken("error");
                erro = erroToken is null ? string.Empty : erroToken.Value<string>();
            }
            if (string.IsNullOrWhiteSpace(erro))
            {
                erro = respostaJson.ToString();
            }
            if (!string.IsNullOrWhiteSpace(erro))
                throw new Exception(erro);
            else
                throw new Exception($"Not possible to read error '{data}'");
        }
    }
    else
    {
        throw new Exception("Error HTTP without message");
    }
}

public async static Task<TRetorno> RetornoComoTipoAsync<TRetorno>(HttpResponseMessage resposta)
{
    var data = await resposta.Content.ReadAsStringAsync();
    if (resposta.IsSuccessStatusCode)
        data = GetReturn(data);
    else
        HandleError(data);
    return string.IsNullOrEmpty(data) ? default(TRetorno) : JsonConvert.DeserializeObject<TRetorno>(data);
}

Однако, если возвращенный JSON в свойстве data очень велик, и много потраченного впустую ресурса тратится на его разбор, и я просто заинтересован вПервый уровень информации.Есть ли более эффективный способ (меньшее время отклика) получить нужную мне информацию (прочитать свойства первого уровня и получить строку внутри свойства data ) без анализа всего JSON?
Спасибо

...