désérialiser dynamiquement json dans n'importe quel objet passé. C#

j'essaie de désérialiser json en un objet en c#. Ce que je veux être en mesure de faire est de passer n'importe quel objet obtenir son type et deserialize le json dans cet objet particulier en utilisant le JSON.Net bibliothèque. Voici les lignes de code.

 Object someObject1 = someObject;
 string result = await content.ReadAsStringAsync();
 return JsonConvert.DeserializeObject<someObject1.GetType()>(result);

la dernière ligne jette une exception de

 operator '<' cannot be applied to operands of type 'method group'

Comment obtenir le type de données dans le sans c# complaint. Que dois-je faire pour que ce code fonctionne? Et quelle connaissance ai-je raté?

2
demandé sur Brian Rogers 2014-09-04 22:12:21

3 réponses

JsonConvert.DeserializeObject<T> nécessite un type de compilation. Vous ne pouvez pas lui passer un type dans le temps d'exécution comme vous voulez le faire en question (rien de différent que de déclarer un List<T> ). Vous devez soit vous désérialiser à un objet JSON Générique JObject (ou à dynamique ) ou vous devez créer une instance d'un objet et le remplir avec json.

vous pouvez utiliser la méthode statique PopulateObject (bien sûr si les propriétés de votre objet match le json que vous voulez désérialiser).

JsonConvert.PopulateObject(result, someObject1 );
3
répondu L.B 2014-09-04 18:26:13

vous pouvez ignorer la méthode générique et utiliser dynamic :

var myObj = (dynamic)JsonConvert.DeserializeObject(result);

cependant, si les objets ne sont pas du même type, vous aurez du mal à distinguer entre les types et probablement frapper les erreurs d'exécution.

0
répondu Dave Zych 2014-09-04 18:19:54

C'est la meilleure façon de remplir les champs d'un objet avec les données JSON.

ce code appartient à l'objet lui-même en tant que méthode.

public void PopulateFields(string jsonData)
{
    var jsonGraph = JObject.Parse(jsonData);
    foreach (var prop in this.GetType().GetProperties())
    {
        try
        {
            prop.SetValue(this, fields[prop.Name].ToObject(prop.PropertyType), null);
        }
        catch (Exception e)
        {
            // deal with the fact that the given
            // json does not contain that property
        }
}
0
répondu Luigi Sacco 2017-06-30 21:32:06