Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用已知类型反序列化对象[]_C#_Json_Serialization_Json.net_Deserialization - Fatal编程技术网

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的解决方案工作得非常好。非常好,它的性能与反序列化为对象时完全一样[]!谢谢