将没有任何属性/元数据的XML转换为.net对象
本文关键字:转换 XML net 对象 元数据 任何 属性 | 更新日期: 2023-09-27 18:14:25
我有一个对象,我使用修改过的DataContractSerializer将它转换为XML。
我去掉了所有的元数据/名称空间等,所以结果是:
<myObject>
<someProperty>5</someProperty>
<mySubObjects>
<mySubObject>...</mySubObject>
<mySubObject>...</mySubObject>
...
</myObject>
等。
我想知道是否有可能把它放回对象。
我能够通过使用JSON部分地做到这一点。. NET将其转换为有效的JSon,但是反序列化JSon和列表存在一个问题,我无法理解,尽管在SO上阅读了关于它的几个解释。
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc, Newtonsoft.Json.Formatting.None, true);
var obj = JsonConvert.DeserializeObject<T>(jsonText);
不能反序列化当前JSON对象(例如{"name":"value"})输入"…"因为该类型需要一个JSON数组(例如[1,2,3])正确反序列化。要修复此错误,可以将JSON更改为一个JSON数组(例如[1,2,3])或更改反序列化的类型,以便它是一个普通的。net类型(例如,不是像integer这样的原始类型,也不是集合类型(如数组或列表),可以从JSON对象。也可以将JsonObjectAttribute添加到to类型强制它从JSON对象反序列化。
应该有一个更直接的解决方案,永远不会有试图做一个无效的强制转换的问题,因为源数据也来自对象,某种映射库或其他东西应该能够照顾到这一点。什么好主意吗?
编辑:根据评论,这里是如何做到这一点,而不必转换为JSON
string xml = "<myObject>'n" +
" <someProperty>5</someProperty>'n" +
" <mySubObjects>'n" +
" <mySubObject>test</mySubObject>'n" +
" <mySubObject>test</mySubObject>'n" +
" </mySubObjects>'n" +
"</myObject>'n";
using (TextReader reader = new StringReader(xml))
{
XmlSerializer serializer = new XmlSerializer(typeof(myObject));
var obj = serializer.Deserialize(reader);
}
支持类:[Serializable()]
public class myObject
{
[XmlElement("someProperty")]
public string someProperty { get; set; }
[XmlArray("mySubObjects")]
[XmlArrayItem("mySubObject", typeof(string))]
public List<string> mySubObjects { get; set; }
}
* * * * * *之前使用JSON响应 :********
下面的代码应该可以帮你完成:
string xml = "<myObject>'n" +
" <someProperty>5</someProperty>'n" +
" <mySubObjects>'n" +
" <mySubObject>test</mySubObject>'n" +
" <mySubObject>test</mySubObject>'n" +
" </mySubObjects>'n" +
"</myObject>'n";
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);
var obj = JsonConvert.DeserializeObject<RootObject>(jsonText);
下面是支持类:
public class MySubObjects
{
public List<string> mySubObject { get; set; }
}
public class MyObject
{
public string someProperty { get; set; }
public MySubObjects mySubObjects { get; set; }
}
public class RootObject
{
public MyObject myObject { get; set; }
}
你遇到的问题是,它试图将mySubObjects转换为类而不是列表。这是因为它将每个mySubObject视为对象本身。通过创建一个类并将List作为属性公开,JSON。Net然后可以将每个mySubObject添加到公开的列表中。将其更改为JSON数组意味着完全取出mySubObjects节点,并仅使用多个。JSON。Net会将其视为数组并将其直接转换为List,而不需要将其封装在单独的类中。我希望我解释对了。