使用JsonConvert.SerializeXmlNode在JSON中定义标准键值对的属性和值

本文关键字:键值对 属性 标准 定义 SerializeXmlNode JsonConvert JSON 使用 | 更新日期: 2023-09-27 18:15:53

我明白这是按预期工作的,但我正试图简化和减少SerializeXmlNode的输出。

代码:

XmlDocument XMLDoc = new XmlDocument();
XMLDoc.LoadXml(NewXML);
string EventDataJSON = JsonConvert.SerializeXmlNode(XMLDoc, 0, true); 

这是我的XML:

<DataEntries>
    <Data Name="Direction">in</Data> 
    <Data Name="SourceAddress">222.0.0.252</Data> 
    <Data Name="SourcePort">5355</Data> 
    <Data Name="DestAddress">192.168.1.24</Data> 
</DataEntries>

当前JSON输出

{"@Name":"Direction","#text":"in"},
{"@Name":"SourceAddress","#text":"222.0.0.252"},
{"@Name":"SourcePort","#text":"5355"},
{"@Name":"DestAddress","#text":"192.168.1.24"}

期望的JSON输出(缩进无关):

{
    "Direction":"in",
    "SourceAddress":"222.0.0.252",
    "SourcePort":"5355",
    "DestAddress":"192.168.1.24"
}

如果没有必要,我宁愿不使用正则表达式,但现在我真的对任何东西都持开放态度。我的另一个选择是使用JavaScriptSerializer,但如果有办法在JSON.net库中做到这一点,那将是首选。

使用JsonConvert.SerializeXmlNode在JSON中定义标准键值对的属性和值

如JSON和XML之间的转换所述,如果从JSON创建的XML与您想要的不匹配,则需要手动转换它。在本例中,由于您事先将XML加载到XmlDocument中,因此似乎最简单的方法是像这样预处理XML:

XmlDocument XMLDoc = new XmlDocument();
XMLDoc.LoadXml(NewXML);
foreach (XmlElement entry in XMLDoc.SelectNodes("//DataEntries"))
{
    var data = entry.ChildNodes.OfType<XmlElement>().ToList();
    foreach (var d in data)
    {
        var e = XMLDoc.CreateElement(d.Attributes["Name"].Value);
        e.InnerText = d.InnerText;
        entry.AppendChild(e);
    }
    foreach (var d in data)
    {
        entry.RemoveChild(d);
    }
}
string EventDataJSON = JsonConvert.SerializeXmlNode(XMLDoc, 0, true);

您可以考虑切换到更现代的LINQ to XML API。如果是这样,您的代码看起来像:

var doc = XDocument.Parse(NewXML);
foreach (var entry in doc.Descendants("DataEntries"))
{
    var data = entry.Elements("Data").ToList();
    foreach (var d in data)
    {
        entry.Add(new XElement((string)d.Attribute("Name"), d.Value));
    }
    data.Remove();
}
string EventDataJSON = JsonConvert.SerializeXNode(doc, 0, true);

样本小提琴。