我有一类需要序列化才能传递给另一个系统。
该类包含一个定义为对象的属性,因为该对象将包含的类的类型在运行时可能会有所不同。
我的课程看起来像是这种简化的模型。
public class MyTestXML
{
public string String1 { get; set; }
public string String2 { get; set; }
[System.Xml.Serialization.XmlElementAttribute("First", typeof(MyFirstObject),
Form = System.Xml.Schema.XmlSchemaForm.Qualified)]
[System.Xml.Serialization.XmlElementAttribute("Second", typeof(MySecondObject),
Form = System.Xml.Schema.XmlSchemaForm.Qualified)]
public object MyObject { get; set; }
}
public class MyFirstObject
{
public string theFirstObjectString { get; set; }
}
public class MySecondObject
{
public string theSecondObjectString { get; set; }
}
此类使用XmlElementAttribute和XmlSerializer完美地序列化为xml,但是当我尝试将其序列化为Json(使用Newtonsoft Json.Net)时,该对象是未定义的类型,因此无法反序列化。
有没有一种方法可以在序列化时在Json属性中指定XmlElementAttribute以获得相同的结果?
我想为序列化的对象提供Json的使用,因为它是xml大小的一半,但是除非我能解决对象属性问题的序列化,否则我不能。
提前致谢。
您将必须创建自己的自定义序列化行为。在这里看看这个答案:https : //stackoverflow.com/a/22722467/2039359关于如何为Json.Net实现自己的JsonConverter
在您的情况下,您可以执行以下操作来创建json
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
MyTestXML myTestXml = (MyTestXML) value;
JObject jObject = JObject.FromObject(value);
JProperty prop = jObject.Children<JProperty>().First(p=>p.Name.Contains("MyObject"));
if (myTestXml.MyObject.GetType() == typeof (MyFirstObject))
{
prop.AddAfterSelf(new JProperty("First", JToken.FromObject(myTestXml.MyObject)));
prop.Remove();
jObject.WriteTo(writer);
}
else if (myTestXml.MyObject.GetType() == typeof (MySecondObject))
{
prop.AddAfterSelf(new JProperty("Second", JToken.FromObject(myTestXml.MyObject)));
prop.Remove();
jObject.WriteTo(writer);
}
}
反序列化时,类似这样
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jo = JObject.Load(reader);
MyTestXML myTestXml = new MyTestXML();
serializer.Populate(jo.CreateReader(), myTestXml);
object myObject = null;
if (jo["First"] != null)
{
myObject = new MyFirstObject { TheFirstObjectString = jo["First"].SelectToken(@"TheFirstObjectString").Value<string>() };
}
if (jo["Second"] != null)
{
myObject = new MySecondObject { TheSecondObjectString = jo["Second"].SelectToken(@"TheSecondObjectString").Value<string>() };
}
myTestXml.MyObject = myObject;
return myTestXml;
}
要使用它,您将JsonConverter
在序列化/反序列化时提供您的代码,如下所示:
var settings = new JsonSerializerSettings();
settings.Converters.Add(new MyTextXmlJsonConverter());
var a = JsonConvert.SerializeObject(myTestXml, settings);
希望这就是您要寻找的
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句