2017-09-22 15 views
0

私はJson.Netを使用してオブジェクトをデシリアライズしようとしています。私は、MyObject.Bodyでシリアル化されたオブジェクトを保持するMyObjectという単純なオブジェクトを持っています。 クラスの型をMyObject.ClassTypeに格納しています。どのタイプをデシリアライズするかを決定するために、巨大なswitch文を書く必要はありません。これを動的に行うことはできますか?Json.Netオブジェクトを動的に逆シリアル化しますか?

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

"fullClassName"がクラス名と一致することを確認できる場合は、リフレクションを使用してタイプを取得できます。 –

+0

私はリフレクションに精通していないので、少し具体的にできますか? – Princess

答えて

2

ていること:

JsonConvert.DeserializeObject(string value, Type type) 

これは型情報ではなく、ジェネリック型パラメータを使用してJSONをデシリアライズします。

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(); 

参照してください:

0

確かに実行できます。シリアライズした文字列が、デシリアライズしようとしているタイプに対応していることを確認してください。たとえば、次のようにあなたが行うことができます

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

を私は上の私の答えを置きます。

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

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

名前型の文字列は、名前空間を含むフルネームである必要があります。例えば。 "ConsoleApplication1.Cat"。 誰かが誤ったtypeNameを入力した場合、タイプが見つからないようにするには、例外処理を行う必要があります。

関連する問題