【问题标题】:Deserialize object[] with known types使用已知类型反序列化 object[]
【发布时间】:2016-10-19 23:05:53
【问题描述】:

假设我们有一个像这样的对象[]:

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

然后最初是“int”类型的deserializedData[0]变成“long”, 最初属于“MyClass”类型的 deserializedData[2] 变成了 JObject。

有没有办法告诉反序列化器在 object[] 的每个索引处期望什么对象类型?

我对创建用于序列化/反序列化的包装类不感兴趣。当我们已经知道结构时,我需要知道是否可以预定义 object[] 的“类型结构”。

【问题讨论】:

    标签: c# json serialization json.net deserialization


    【解决方案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
    

    【讨论】:

    • 完美,它的执行与反序列化为对象[] 完全相同!谢谢
    【解决方案2】:

    您可以将 JSON 加载到临时 JArray 中,然后将其与原始数组一起 zip 并使用 ToObject() 反序列化每个项目,从原始数组中获取项目类型:

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

    示例fiddle

    【讨论】:

    • 感谢您的努力,我没有去测试它,因为 Nkosi 的解决方案非常有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2015-03-23
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多