首页 > 解决方案 > 从对象到 Json 到 Xml 到对象

问题描述

我有这些课程:

public class House
{
    public MyObject[] Objects { get; set; }
}

public class MyObject
{
    public string Name { get; set; }
}

我这样实例化:

var house1 = new House
{
     Objects = new MyObject[]
     {
          new MyObject() { Name = "Name1" },
          new MyObject() { Name = "Name2" }
     }
 };

然后我得到它的 json 表示:

var jsonSerializerSettings = new JsonSerializerSettings()
{
    TypeNameHandling = TypeNameHandling.Objects
};
string json = JsonConvert.SerializeObject(house1, jsonSerializerSettings);

从后者我得到相对的XML:

XmlDocument doc = (XmlDocument)Newtonsoft.Json.JsonConvert.DeserializeXmlNode(json, "House", true);
string xmlString = doc.OuterXml;

最后,我将 xml 转换为初始类型的对象:

XmlSerializer serializer = new XmlSerializer(typeof(House));
TextReader reader = new StringReader(xmlString);
House house2 = (House)serializer.Deserialize(reader)

问题是:

在这里您可以找到一个 dotnetfiddle 示例

标签: c#jsonxml

解决方案


JSON序列化程序生成的XML:

<House xmlns:json="http://james.newtonking.com/projects/json" json:type="Program+House, ayusorzt">
    <Objects json:type="Program+MyObject, ayusorzt">
       <Name>
           Name1
       </Name>
    </Objects> 
    <Objects json:type="Program+MyObject, ayusorzt">
       <Name>
           Name2
       </Name>
    </Objects>
</House>

XMLSerializer无法解除此 XML 对象的脱轨。正确的 XML 对象应如下所示:

<House>
    <Objects>
       <MyObject>
           <Name>
               Name1
           </Name>
       </MyObject>       
       <MyObject>
           <Name>
               Name2
           </Name>
       </MyObject>
    </Objects> 
</House>

您可以通过以下代码修复它:

var xmlSerializer = new XmlSerializer<House>();
var obj = JsonConvert.DeserializeObject<House>();

using(StringWriter textWriter = new StringWriter())
{
    xmlSerializer.Serialize(textWriter, obj);
    string yourXml = textWriter.ToString();
}

推荐阅读