2016-10-19 3 views
1

позволяет сказать, что у нас есть объект [], как это:объект Deserialize [] с известными типами

int Num = 3; 
string Str = "test"; 
MyClass Obj = new MyClass(); 

object[] data = new object[] {Num, Str, Obj}; 

Я могу легко сериализовать что

string json = JsonConvert.SerializeObject(data); 

но если я десериализации его

object[] deserializedData = JsonConvert.DeserializeObject<object[]>(json); 

Затем десериализованнаяДата [0], которая первоначально имела тип «int», становится «длинной», deserializedData [2], которая первоначально была типа «MyClass» становится JObject.

Есть ли способ рассказать десериализатору, какие типы объектов ожидать от каждого индекса объекта []?

Я не заинтересован в создании класса-оболочки для сериализации/десериализации. Мне нужно знать, можно ли предопределить «структуру типа» объекта [], когда мы уже знаем структуру.

ответ

1

Json.Net также делает использование динамических объектов, которые могут быть использованы для вывода типа при обращении к каждому индексу object[]

using System; 
using Newtonsoft.Json;  


public class Program 
{ 
    public class MyClass{ public string Property {get;set;}} 

    public static void Main() 
    { 

     int Num = 3; 
     string Str = "test"; 
     MyClass Obj = new MyClass() { Property = "Hellow World"}; 

     object[] data = new object[] {Num, Str, Obj}; 

     string json = JsonConvert.SerializeObject(data); 

     Console.WriteLine("Serialized Object: ");  
     Console.WriteLine(json); 

     dynamic deserializedData = JsonConvert.DeserializeObject(json); 

     int Num2 = deserializedData[0]; 
     string Str2 = deserializedData[1]; 
     MyClass Obj2 = deserializedData[2].ToObject<MyClass>(); 

     Console.WriteLine(); 
     Console.WriteLine("Deserialized Values: ");  
     Console.WriteLine("Num: {0} - {1} Equal: {2}",Num,Num2,Num==Num2); 
     Console.WriteLine("Str: {0} - {1} Equal: {2}",Str,Str2,Str==Str2); 
     Console.WriteLine("Obj: {0} - {1} Equal: {2}",Obj,Obj2,Obj.Property==Obj2.Property); 

    } 
} 

Выхода:

Serialized Object: 
[3,"test",{"Property":"Hellow World"}] 

Deserialized Values: 
Num: 3 - 3 Equal: True 
Str: test - test Equal: True 
Obj: Program+MyClass - Program+MyClass Equal: True 
+0

Отлично, и он выполняет то же самое, что и десериализован как объект []! благодаря – NicolaiM

1

Вы можете загрузить JSON во временную JArray, затем zip его исходного массива и десериализации каждый элемент с ToObject(), принимая тип элемента из исходного массива:

 var deserializedData = JArray.Parse(json) 
      .Zip(data, (t, o) => (o == null ? t.ToObject<object>() : t.ToObject(o.GetType()))) 
      .ToArray(); 

Sample fiddle.

+0

Спасибо за усилия, я не смог его проверить, потому что решение Nkosi отлично работало. – NicolaiM

Смежные вопросы