Я разработал вспомогательный класс, который считывает возврат вызова 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?
Спасибо