C# 反序列化不明确的json
XmlElement属性控制xml序列化,因此这将导致:C# 反序列化不明确的json,c#,xml,json,serialization,C#,Xml,Json,Serialization,XmlElement属性控制xml序列化,因此这将导致: public abstract class A { public string Foo{ get; set; } } public class B : A { public string Marco{ get; set; } } public class C : A { public string Las{ get; set; } } public class D : A { public strin
public abstract class A {
public string Foo{ get; set; }
}
public class B : A {
public string Marco{ get; set; }
}
public class C : A {
public string Las{ get; set; }
}
public class D : A {
public string Las{ get; set; }
}
public class SerializeMe {
[XmlElement("b", typeof(B))]
[XmlElement("c", typeof(C))]
[XmlElement("d", typeof(D))]
public A[] serializeProp { get; set; }
}
SerializeMe me = new SerializeMe();
me.serializeProp = new A[]{
new B(){ Foo = "bar", Marco = "polo" },
new C(){ Foo = "bar", Las = "Vegas" },
new D(){ Foo = "bar", Las = "Vegas" }
};
但是,与xml不同,它不包含关于类型的详细信息,因此我不清楚它是否能够正确识别要反序列化到的类。使用现有的json结构是否有正确的反序列化方法,或者我是否必须修改json结构(以及如何最好地进行修改)
我考虑重写序列化,以便生成以下格式:
{[
{"Foo":"bar", "Marco":"polo"},
{"Foo":"bar", "Las":"Vegas"},
{"Foo":"bar", "Las":"Vegas"}
]}
有更好的方法吗?您可以省去嵌套的
“object”=
,只使用一个无效属性名的字符串作为类标识符:
{[
{"class":"B",
"object":{"Foo":"bar", "Marco":"polo"}},
{"class":"C",
"object":{"Foo":"bar", "Las":"Vegas"}},
{"class":"D",
"object":{"Foo":"bar", "Las":"Vegas"}}
]}
JSON.net具有内置的TypeNameHandling功能,生成的JSON如下所示:
{"Foo":"bar", "Marco":"polo", "$Class"="B"}
请注意,如果使用TypeNameHandling,json可以构造任意类型。因此,您可能不希望从不受信任的源反序列化json
{"Foo":"bar", "Marco":"polo", "$Class"="B"}
{"$type":"Tests.MessageWrapper2, Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
"Headers":{"$type":"System.Collections.Hashtable, mscorlib, Version=2.0.0.0, Culture=neutral,PublicKeyToken=b77a5c561934e089","DeliverAt":"yesterday!"},
"Body":{"$type":"Tests.TestMessage1, Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null","Id":893239}
}