Qual é a prática recomendada para recuperar valores JSON que podem nem mesmo existir em C # usando Json.NET ?
No momento, estou lidando com um provedor JSON que retorna JSON que às vezes contém determinados pares de chave / valor e às vezes não. Tenho usado (talvez incorretamente) este método para obter meus valores (exemplo para obter um duplo):
if(null != jToken["width"])
width = double.Parse(jToken["width"].ToString());
else
width = 100;
Isso funciona bem, mas quando há muitos deles é complicado. Acabei escrevendo um método de extensão e só depois de escrevê-lo me pergunto se não estava sendo burro ... de qualquer forma, aqui está o método de extensão (eu só incluo casos para double e string, mas na realidade tenho alguns Mais):
public static T GetValue<T>(this JToken jToken, string key,
T defaultValue = default(T))
{
T returnValue = defaultValue;
if (jToken[key] != null)
{
object data = null;
string sData = jToken[key].ToString();
Type type = typeof(T);
if (type is double)
data = double.Parse(sData);
else if (type is string)
data = sData;
if (null == data && type.IsValueType)
throw new ArgumentException("Cannot parse type \"" +
type.FullName + "\" from value \"" + sData + "\"");
returnValue = (T)Convert.ChangeType(data,
type, CultureInfo.InvariantCulture);
}
return returnValue;
}
E aqui está um exemplo de uso do método de extensão:
width = jToken.GetValue<double>("width", 100);
BTW, por favor, perdoe o que pode ser uma pergunta realmente estúpida, já que parece que algo deveria haver uma função embutida para ... Eu tentei a documentação do Google e Json.NET , no entanto, sou inepto em encontrar a solução para minha dúvida ou não está claro na documentação.
GetValue
abaixoRespostas:
É basicamente para isso que
Value()
serve o método genérico . Você obtém exatamente o comportamento que deseja se combiná-lo com tipos de valor anuláveis e o??
operador:fonte
jToken
fornull
, mas não é isso que a pergunta feita. E você pode facilmente corrigir isso usando o nulo operador condicional:width = jToken?.Value<double?>("width") ?? 100;
.JToken.Value<T>
lança uma exceção se o JToken for um JValueEu escreveria
GetValue
como abaixoDessa forma, você pode obter o valor não apenas dos tipos básicos, mas também de objetos complexos. Aqui está um exemplo
fonte
retrieving JSON values that may not even exist
e tudo que propus foi mudar seuGetValue
método. Acho que funciona como você desejaVeja como você pode verificar se o token existe:
Ele verifica se "Itens" existe em "Resultado".
Este é um exemplo que NÃO funciona e causa exceção:
fonte
Você pode simplesmente fazer o typecast e ele fará a conversão para você, por exemplo
Ele retornará automaticamente
null
se a referida chave não estiver presente no objeto, portanto, não há necessidade de testá-la.fonte
TYPE variable = jsonbody["key"]?.Value<TYPE>() ?? DEFAULT_VALUE;
por exemplo
bool attachMap = jsonbody["map"]?.Value<bool>() ?? false;
fonte
Isso cuida de nulos
fonte