C# 使用已知类型反序列化对象[]
假设我们有一个对象[],如下所示:C# 使用已知类型反序列化对象[],c#,json,serialization,json.net,deserialization,C#,Json,Serialization,Json.net,Deserialization,假设我们有一个对象[],如下所示: 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.Deseriali
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);
object[]反序列化数据=JsonConvert.DeserializeObject(json);
然后,最初为“int”类型的反序列化数据[0]变为“long”,
最初为“MyClass”类型的反序列化数据[2]变成了JObject
有没有办法告诉反序列化程序在对象[]的每个索引处预期的对象类型
我对创建用于序列化/反序列化的包装器类不感兴趣。我需要知道,当我们已经知道对象[]的“类型结构”时,是否可以预定义该对象[]的“类型结构”。您可以将JSON加载到一个临时数组中,然后将其与原始数组一起加载,并使用反序列化每个项,从原始数组中获取项类型:
var deserializedData = JArray.Parse(json)
.Zip(data, (t, o) => (o == null ? t.ToObject<object>() : t.ToObject(o.GetType())))
.ToArray();
var deserializedData=JArray.Parse(json)
.Zip(数据,(t,o)=>(o==null?t.ToObject():t.ToObject(o.GetType()))
.ToArray();
示例。Json.Net还使用动态对象,在访问
对象[]的每个索引时,可以使用动态对象推断类型。
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);
}
}
感谢您的努力,我没有去测试它,因为Nkosi的解决方案工作得非常好。非常好,它的性能与反序列化为对象时完全一样[]!谢谢