将没有任何属性/元数据的XML转换为.NET对象

时间:2014-07-22 15:13:10

标签: c# xml-deserialization

我有一个对象,我使用修改后的DataContractSerializer将其转换为XML。

我删除所有元数据/名称空间等,结果只是:

<myObject> <someProperty>5</someProperty> <mySubObjects> <mySubObject>...</mySubObject> <mySubObject>...</mySubObject> ... </myObject>

我想知道是否可以将它放回到物体中。

我能够通过使用JSON.NET将其转换为有效的JSon来部分地完成它,但是反序列化JSon和Lists是一个我无法理解的问题,尽管在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类型(例如,不是像整数那样的原始类型,而不是   可以从a反序列化的集合类型,如数组或List)   JSON对象。 JsonObjectAttribute也可以添加到类型中   强制它从JSON对象反序列化。

应该有一个更直接的解决方案,因为源数据也来自对象,所以永远不会出现尝试进行无效转换的问题,某种映射库或某些东西应该可以解决这个问题。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

编辑:根据评论,这里是你如何做而不必转换为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强制转换为类而不是List。这是因为它将每个mySubObject视为一个对象本身。通过创建一个类并将List作为属性公开,JSON.Net可以将每个mySubObject添加到公开的列表中。将其更改为JSON数组意味着完全取出mySubObjects节点,并使用多个节点。然后,JSON.Net将其视为一个数组,并将其直接转换为List,而不是将其封装在一个单独的类中。我希望我能正确解释。