2017-09-22 1 views
0

J'essaye de désérialiser un objet en utilisant Json.Net. J'ai un objet simple appelé MyObject qui contient un objet sérialisé dans MyObject.Body. Je stocke le type de classe dans MyObject.ClassType. Je ne veux pas écrire une déclaration de changement géante pour déterminer le type à désérialiser. Puis-je le faire dynamiquement?Json.Net Désérialise dynamiquement un objet?

string value = "fullClassName"; 
switch (value) 
{ 
    case "Cat": 
     var cat = JsonConvert.DeserializeObject<Cat>(myObject.Body); 
     break; 
    case "Dog": 
     var dog = JsonConvert.DeserializeObject<Dog>(myObject.Body); 
     break; 
} 


public class MyObject 
{ 
    public string Body { get; set; } 
    public string ClassType { get; set; } 
}  


var myAnimal = JsonConvert.DeserializeObject<1of10TypesOfObjects> (myObject.Body); 
+1

Vous pouvez utiliser la réflexion pour obtenir le type si vous pouvez vous assurer que "fullClassName" correspondra à votre nom de classe. –

+0

Je ne suis pas familier avec la réflexion pourriez-vous être un peu plus précis? – Princess

Répondre

2

Vous pouvez le faire avec:

JsonConvert.DeserializeObject(string value, Type type) 

Cela désérialiser le JSON en utilisant les informations de type plutôt que d'un paramètre de type générique.

var myObjects = new List<MyObject> 
{ 
    new MyObject 
    { 
     ClassType = typeof(Cat).FullName, 
     Body = JsonConvert.SerializeObject(new Cat { Fluffiness = 10 }) 
    }, 
    new MyObject 
    { 
     ClassType = typeof(Dog).FullName, 
     Body = JsonConvert.SerializeObject(new Dog { Loudness = 3 }) 
    } 
}; 

List<object> objects = 
    myObjects 
     .Select(myObject => 
      JsonConvert.DeserializeObject(
      myObject.Body, 
      typeof(Cat).Assembly.GetType(myObject.ClassType))) 
     .ToList(); 

Voir:

0

Bien sûr, vous pouvez le faire. Assurez-vous que la chaîne sérialisée correspond au type que vous essayez de désérialiser. Par exemple:

class Dog 
{ 
    public string Name { get; set; } 
} 

class Cat 
{ 
    public string Type { get; set; } 
} 
class Program 
{ 
    static void Main(string[] args) 
    { 
     Dog dog = new Dog { Name = "My Dog" }; 
     string strDog = JsonConvert.SerializeObject(dog); 

     Cat cat = new Cat { Type = "My Cat" }; 
     string strCat = JsonConvert.SerializeObject(cat); 

     var dog2 = JsonConvert.DeserializeObject<Dog>(strDog); 
     var cat2 = JsonConvert.DeserializeObject<Cat>(strCat); 
     Console.WriteLine(cat2.Type); 
     Console.WriteLine(dog2.Name);   

    } 
} 

1

je mets ma réponse.

string typeName = "ConsoleApplication1.Cat"; 
var type = Type.GetType(typeName); 
var myObject = new MyObject {Body = "{ Color: 'red' }"}; 

var res = JsonConvert.DeserializeObject(myObject.Body, type); 

Veuillez vous assurer que la chaîne de nom de type doit être un nom complet, qui inclut l'espace de noms. Par exemple. "ConsoleApplication1.Cat". Et vous devez avoir besoin de faire un peu de gestion des exceptions pour éviter le type non trouvé si quelqu'un saisit le mauvais typeName.