使用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库中做到这一点,那将是首选。
如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);
样本小提琴。