将C#类的层次结构序列化和反序列化为Json

时间:2016-10-12 16:54:25

标签: c# json serialization json.net deserialization

有没有办法序列化然后反序列化具有未知类型的成员变量的类,该类可以是简单的值类型,也可以是包含类本身的实例?

public class A
{
    public dynamic Value { get; set; }//Value could be int or type A for example
}

public static class ASerializer
{
    public static string ToJson(A table)
    {
        return JsonConvert.SerializeObject(table);//using Json.Net
    }

    public static A FromJson(string json)
    {
        return JsonConvert.DeserializeObject<A>(json);
    }
}

public class Tests
{
    public static void TestASerialization()
    {
        var a = new A() { Value = 1 };
        var aa = new A { Value = a };
        var aaa = new A { Value = aa };
        var json = ASerializer.ToJson(aaa);
        var aaa2 = ASerializer.FromJson(json);

        var aa2 = (A)aaa2.Value;    //throws
    }
}

如果我序列化然后反序列化aaa - 我无法将反序列化的aaa的值转换回类型A我得到:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:无法将类型'Newtonsoft.Json.Linq.JObject'转换为 'A'

有关优雅处理此嵌套层次结构的任何建议,而不需要手工编码? 似乎只使用A的一个实例,其值为A类型。

2 个答案:

答案 0 :(得分:0)

你不能施展你认为自己正在施展的东西。

在这种情况下,您实际上将fdsa.txt属性转换为Value。在访问属性之前,您需要使用强制转换将A实例包装在参数中。

aaa2

答案 1 :(得分:0)

Dynamic主要是编译器黑客,我会建议使用泛型。 @David L的回答也是正确的。

public class A<T>
{
    public T Value { get; set; }
}