【问题标题】:Converting XML into JSON to Deserialize into class将XML转成JSON反序列化成类
【发布时间】:2018-12-11 00:23:48
【问题描述】:

在这里寻求帮助。我有一种情况,我们从 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"
    }
}

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

【问题讨论】:

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


    【解决方案1】:

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

    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"}
    

    您可能还需要在模型中的 @type 属性上使用 [JsonProperty] 属性,以使其干净地反序列化。没有它,我无法让它工作。我建议无论如何都这样做,这样您就可以遵循正常的 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

    【讨论】:

      猜你喜欢
      • 2022-08-21
      • 2017-12-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多