[英]Parse json document to extract node's value without knowing root property name in C#( .net core)
有沒有更好的方法來解析 json 文檔並在 C#(.net core) 中提取特定節點的屬性值,而不知道根屬性的名稱? 給定: - json 文檔的根將只有一個屬性,但屬性名稱未知。 寧願有一個不使用 NewtonSoft 庫而是使用 System.Text.JSon 的解決方案
示例 json 文檔如下:
{
"rootPropertyName": {
"someProperty1": "TCC",
"someProperty2": "128-1600-8routeextent",
"eventType": "RouteUpdated",
---leaving other properties for sake of brevity---
}
}
如上所示,我想解析上面的 json 文檔以提取特定節點的值,比如“eventType”(我知道這個屬性名稱),但我不知道根屬性名稱。
當前實施:
using JsonDocument doc = JsonDocument.Parse(jsonContent);
{
JsonElement root = doc.RootElement;
string rootPropertyName = root.EnumerateObject().First().Name;
var eventType = root.GetProperty(rootPropertyName).GetProperty("eventType").GetString();
var payload = root.GetProperty(rootPropertyName).ToString();
return (eventType, payload);
}
您可以反序列化為Dictionary<string, YourClass>
。 將有一個鍵rootPropertyName
,值將是整個{ "someProperty1":...
object
class YourClass
{
public string someProperty1;
public string someProperty2;
public string eventType;
}
var dict = JsonSerializer.Deserialize<Dictionary<string, YourClass>>(jsonContent);
return (dict.Values.First.eventType, dict.Keys.First);
嘗試這個
using JsonDocument doc = JsonDocument.Parse(json);
Dictionary<string,string> propertiesDict = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string,string>>
(doc.RootElement.EnumerateObject().First().Value.ToString());
string someProperty2 = propertiesDict["someProperty2"];
或者您可以反序列化為 ac# 對象
Properties properties = System.Text.Json.JsonSerializer.Deserialize<Properties>(
doc.RootElement.EnumerateObject().First().Value.ToString());
string someProperty2 = properties.someProperty2;
班級
class Properties
{
public string someProperty1 { get; set; }
public string someProperty2 { get; set; }
public string eventType { get; set; }
}
你可以使用正則表達式
(?:\"your-key\"\s*\:\s*)((\[((?<g1>[^\[\]]+|(?1))*)\])|({((?<g2>[^{}]+|(?1))*)})|(\".*\"))
在 c# 中它看起來像這樣
public static string GetValue(string json, string key, string json)
{
var pattern = $"(?:\"{key}\"\\s*\\:\\s*)((\\[((?<g1>[^\\[\\]]+|(?1))*)\\])|({{((?<g2>[^{{}}]+|(?1))*)}})|(\".*\"))";
var regex = new PCRE.PcreRegex(pattern);
return regex.Match(json).Value;
}
注意:我使用Pcre.Net nugget 包,因為 .net 的正則表達式不支持某些功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.