我有以下 xml 字串格式,其中屬性鍵是隨機的且未知但始終以字母數字字符開頭
<properties>
<property key="EventId">3300</property>
<property key="source">car</property>
<property key="type">omega</property>
<property key="a341414">any value</property>
<property key="arandomstring_each_time_different">any value</property>
....
</properties>
如何實作以下格式
{
"properties":
{
"EventId": "3300",
"source": "car",
...
}
}
我嘗試了以下代碼的一些變體,但沒有運氣
XDocument doc = XDocument.Parse(string);
string jsonText = JsonConvert.SerializeXNode(doc);
var dynamic = JsonConvert.DeserializeObject<ExpandoObject>(jsonText);
輸出
{
"properties":{
"property":[
{
"@key":"EventId",
"#text":"3300"
},
{
"@key":"source",
"#text":"car"
},
...
]
}
}
uj5u.com熱心網友回復:
Json.NET 的行為如Converting between JSON and XML 中所述:
單個子文本節點是直接針對元素的值,否則通過#text 訪問它們。
由于您的<property>節點具有屬性,因此該值被放入一個#text屬性中。
但是,為什么使用Json.NET轉換從XElement到ExpandoObject?直接使用 LINQ to XML 進行轉換非常簡單:
var doc = XDocument.Parse(xml);
IDictionary<string, object> properties = new ExpandoObject();
foreach (var property in doc.Root.Elements("property"))
properties.Add(property.Attribute("key").Value, property.Value);
dynamic d = new ExpandoObject();
d.properties = properties;
根據需要,結果如下:
{
"properties": {
"EventId": "3300",
"source": "car",
"type": "omega",
"a341414": "any value",
"arandomstring_each_time_different": "any value"
}
}
演示小提琴在這里。
uj5u.com熱心網友回復:
如果您想純粹依賴 Json.Net,那么您也可以這樣做:
var docInXml = XDocument.Parse("...");
var docInJson = JsonConvert.SerializeXNode(docInXml);
var semiParsedJson = JObject.Parse(docInJson);
var propertyCollection = semiParsedJson["properties"]["property"] as JArray;
var keyValueMapping = new Dictionary<string, string>();
foreach(var item in propertyCollection.Children())
{
keyValueMapping.Add((string)item["@key"], (string)item["#text"]);
}
var result = new JObject(new JProperty("properties", JObject.FromObject(keyValueMapping)));
讓我們一行一行地看代碼:
var docInXml = XDocument.Parse("...");
- 它將 xml 字串決議為
XDocument
var docInJson = JsonConvert.SerializeXNode(docInXml);
- 它將序列化為
XDocumentjson
{
"properties":{
"property":[
{
"@key":"EventId",
"#text":"3300"
},
{
"@key":"source",
"#text":"car"
},
{
"@key":"type",
"#text":"omega"
},
{
"@key":"a341414",
"#text":"any value"
},
{
"@key":"arandomstring_each_time_different",
"#text":"any value"
}
]
}
}
var semiParsedJson = JObject.Parse(docInJson);
- 它對 json 進行半決議以便能夠執行節點遍歷
var propertyCollection = semiParsedJson["properties"]["property"] as JArray;
- 它將
property集合作為陣列檢索
var keyValueMapping = new Dictionary<string, string>();
- 它為鍵屬性和文本值定義了一個臨時存盤
foreach(var item in propertyCollection.Children())
- 它遍歷陣列的項
keyValueMapping.Add((string)item["@key"], (string)item["#text"]);
- 它檢索所需的欄位并將它們轉換
JObject為string - 它將它們存盤在中間存盤器中
JObject.FromObject(keyValueMapping)))
- 它將轉換
Dictionary為JObject
{
"EventId": "3300",
"source": "car",
"type": "omega",
"a341414": "any value",
"arandomstring_each_time_different": "any value"
}
var result = new JObject(new JProperty("properties", ...));
- 最后,它圍繞上面創建的創建了一個包裝器
JObject
{
"properties": {
"EventId": "3300",
"source": "car",
"type": "omega",
"a341414": "any value",
"arandomstring_each_time_different": "any value"
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/404634.html
標籤:
下一篇:如何識別Json語法以獲取值
