簡體   English   中英

解析 json 文檔以提取節點的值而不知道 C#(.net 核心)中的根屬性名稱

[英]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.

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