簡體   English   中英

使用JsonConvert.SerializeXmlNode為JSON中的標准鍵值對定義屬性和值

[英]Define attribute and value for standard key-value pair in JSON using JsonConvert.SerializeXmlNode

我知道這可以按預期工作,但是我正在嘗試簡化和減少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);

樣品提琴

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM