将XML转换为JSON以反序列化为类

时间:2018-12-11 00:23:49

标签: c# .net json xml json.net

在这里寻求帮助。我有一种情况,我们是从Web服务调用中获取这种XML的。

<root type="object">
    <dealId>2959</dealId>
    <dealDetailId>2</dealDetailId>
    <localeId>1542</localeId>
</root>

这是我要使用的代码。

public class Info
{
    public string @type { get; set; }
    public string dealId { get; set; }
    public string dealDetailId { get; set; }
    public string localeId { get; set; }
}

[TestMethod]
public void TestXMLToJson()
{
    string xml = @"<root type=""object"">
                        <dealId>2959</dealId>
                        <dealDetailId>2</dealDetailId>
                        <localeId>1542</localeId>
                    </root>";

    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml);
    string jsonText = JsonConvert.SerializeXmlNode(doc);
    Info deal = JsonConvert.DeserializeObject<Info>(jsonText);
}

运行此命令并查看jsonText时,将得到以下结果:

{"root":"@type":"object","dealId":"2959","dealDetailId":"2","localeId":"1542"}}

在Json Viewer中看起来像这样:

{
    "root": {
        "@type": "object",
        "dealId": "2959",
        "dealDetailId": "2",
        "localeId": "1542"
    }
}

我希望我只是做一些愚蠢的事情,您能提供的任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

要在没有root对象包装器的情况下将XML转换为JSON,您需要为SerializeXmlNode方法的true参数传递omitRootObject。更改此行:

string jsonText = JsonConvert.SerializeXmlNode(doc);

对此:

string jsonText = JsonConvert.SerializeXmlNode(doc, Newtonsoft.Json.Formatting.None, true);

这将从XML中生成以下JSON:

{"@type":"object","dealId":"2959","dealDetailId":"2","localeId":"1542"}

您可能还需要在模型的[JsonProperty]属性上使用@type属性,以使其清晰地反序列化。没有那个,我无法使其工作。我还是建议这样做,以便您可以遵循常规的C#命名约定,而不必在代码中都使用丑陋的@

public class Info
{
    [JsonProperty("@type")]
    public string Type { get; set; }
    [JsonProperty("dealId")]
    public string DealId { get; set; }
    [JsonProperty("dealDetailId")]
    public string DealDetailId { get; set; }
    [JsonProperty("localeId")]
    public string LocaleId { get; set; }
}

正在运行的演示:https://dotnetfiddle.net/sJpKl3


所有这些,如果您的最终目标是将XML反序列化为模型,那么为什么仍要转换为JSON?您可以使用XmlSerializer直接进行操作。

首先,像这样标记您的模型:

[XmlRoot("root")]
public class Info
{
    [XmlAttribute("type")]
    public string Type { get; set; }
    [XmlElement("dealId")]
    public string DealId { get; set; }
    [XmlElement("dealDetailId")]
    public string DealDetailId { get; set; }
    [XmlElement("localeId")]
    public string LocaleId { get; set; }
}

然后,像这样反序列化:

string xml = 
@"<root type=""object"">
  <dealId>2959</dealId>
  <dealDetailId>2</dealDetailId>
  <localeId>1542</localeId>
</root>";

StringReader reader = new StringReader(xml);
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Info));
Info info = (Info)xmlSerializer.Deserialize(reader);

提琴:https://dotnetfiddle.net/LibYVu