Obtenga valor de JToken que puede no existir (mejores prácticas)

Obtenga valor de JToken que puede no existir (mejores prácticas)

Esto es más o menos lo que el método genérico Value() es para. Obtiene exactamente el comportamiento que desea si lo combina con tipos de valores anulables y el ?? operador:

width = jToken.Value<double?>("width") ?? 100;

Yo escribiría GetValue como abajo

public static T GetValue<T>(this JToken jToken, string key, T defaultValue = default(T))
{
    dynamic ret = jToken[key];
    if (ret == null) return defaultValue;
    if (ret is JObject) return JsonConvert.DeserializeObject<T>(ret.ToString());
    return (T)ret;
}

De esta manera, puede obtener el valor no solo de los tipos básicos sino también de los objetos complejos. Aquí hay una muestra

public class ClassA
{
    public int I;
    public double D;
    public ClassB ClassB;
}
public class ClassB
{
    public int I;
    public string S;
}

var jt = JToken.Parse("{ I:1, D:3.5, ClassB:{I:2, S:'test'} }");

int i1 = jt.GetValue<int>("I");
double d1 = jt.GetValue<double>("D");
ClassB b = jt.GetValue<ClassB>("ClassB");

Así es como puede verificar si el token existe:

if (jobject["Result"].SelectToken("Items") != null) { ... }

Comprueba si "Elementos" existen en "Resultado".

Este es un ejemplo que NO funciona y causa una excepción:

if (jobject["Result"]["Items"] != null) { ... }