Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.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# 反序列化不明确的json_C#_Xml_Json_Serialization - Fatal编程技术网

C# 反序列化不明确的json

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

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 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}
}