Convertir un JToken (o cadena) a un tipo dado

TL; versión DR

Tengo un objeto de tipoJToken (pero también puede ser unstring) y necesito convertirlo en un Tipo contenido en eltype variable:

Type type = typeof(DateTime); /* can be any other Type like string, ulong etc */
var obj = jsonObject["date_joined"]; /* contains 2012-08-13T06:01:23Z+05:00 */
var result = Some_Way_To_Convert(type, obj);

Lo anteriorresult debe ser un objeto DateTime con el valor dado endate_joined.

Historia completa

Estoy usando RestSharp y Json.NET en un proyecto de Windows Phone y estoy atascado al intentar deserializar las respuestas JSON de una API REST.

Lo que realmente estoy tratando de lograr es escribir un método genérico que pueda asignar fácilmente mi respuesta JSON a mis entidades CLR, al igual que usted puede hacer con RestSharp ya. El único problema es que la implementación de RestSharp predeterminada no funciona para mí y no puede analizar correctamente el JSON ya que la respuesta no siempre devuelve todas las propiedades (no devuelvo campos que sonnull desde el servidor REST).

Es por eso que decidí usar Json.NET de Newtonsoft ya que tiene un motor de deserialización Json mucho más potente. Desafortunadamente, no admite nombres de propiedades / campos difusos como RestSharp (o no he encontrado ninguno), por lo que tampoco se asigna correctamente a mis entidades CLR cuando uso algo como decirJsonConvert.DeserializeObject<User>(response.Content).

Así es como se ve mi Json (un ejemplo en realidad):

{
    "id" : 77239923,
    "username" : "UzEE",
    "email" : "[email protected]",
    "name" : "Uzair Sajid",
    "twitter_screen_name" : "UzEE",
    "join_date" : "2012-08-13T05:30:23Z05+00",
    "timezone" : 5.5,
    "access_token" : {
        "token" : "nkjanIUI8983nkSj)*#)(kjb@K",
        "scope" : [ "read", "write", "bake pies" ],
        "expires" : 57723
    },
    "friends" : [{
        "id" : 2347484",
        "name" : "Bruce Wayne"
    },
    {
        "id" : 996236,
        "name" : "Clark Kent"
    }]
}

Y aquí hay un ejemplo de mis entidades CLR:

class AccessToken 
{
    public string Token { get; set; }
    public int Expires { get; set; }
    public string[] Scope { get; set; }
    public string Secret { get; set; } /* may not always be returned */
}

class User
{
    public ulong Id { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public string Name { get; set; }
    public string TwitterScreenName { get; set; }
    public DateTime JoinDate { get; set; }
    public float Timezone { get; set; }
    public bool IsOnline { get; set; } /* another field that might be blank e.g. */

    public AccessToken AccessToken { get; set; }

    public List<User> Friends { get; set; }
}

Lo que quiero es una forma sencilla de analizar el JSON anterior en los objetos CLR dados. He mirado alrededor del código fuente de RestSharp y he visto elJsonDeserializer Código y he podido escribir un método de extensión genéricoDeserializeResponse<T> enJObject Eso debería devolver un objeto de un tipo.T. El uso previsto es algo como esto:

var user = JObject.Parse(response.Content).DeserializeResponse<User>();

El método anterior debe analizar la respuesta Json dada a un objeto de entidad de usuario. Aquí hay un fragmento de código real de lo que estoy haciendo en elDeserializeResponse<User> Método de extensión (basado en el código RestSharp):

public static T DeserializeResponse<T>(this JObject obj) where T : new()
{
    T result = new T();
    var props = typeof(T).GetProperties().Where(p => p.CanWrite).ToList();
    var objectDictionary = obj as IDictionary<string, JToken>;

    foreach (var prop in props)
    {
        var name = prop.Name.GetNameVariants(CultureInfo.CurrentCulture).FirstOrDefault(n => objectDictionary.ContainsKey(n));
        var value = name != null ? obj[name] : null;

        if (value == null) continue;

        var type = prop.PropertyType;

        if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>))
        {
            type = type.GetGenericArguments()[0];
        }

        // This is a problem. I need a way to convert JToken value into an object of Type type
        prop.SetValue(result, ConvertValue(type, value), null); 
    }

    return result;
}

Supongo que la conversión debería ser una tarea realmente sencilla ya que es una tarea trivial. Pero he estado buscando durante bastante tiempo y todavía no he encontrado la manera de hacerlo a través de Json.NET (y, para ser sinceros, la documentación es algo que hay que entender y falta algunos ejemplos).

Cualquier ayuda sería realmente apreciada.

Respuestas a la pregunta(4)

Su respuesta a la pregunta