我有一个对象,我使用修改后的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对象反序列化。
应该有一个更直接的解决方案,因为源数据也来自对象,所以永远不会出现尝试进行无效转换的问题,某种映射库或某些东西应该可以解决这个问题。有什么想法吗?
答案 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,而不是将其封装在一个单独的类中。我希望我能正确解释。