C# net8 讀取Json字串 並實現 針對json字串內元素名稱搜尋 並返回搜尋的對應元素值 範例
C# net8 讀取Json字串 並實現 針對json字串內元素名稱搜尋/尋找(Search) 並返回搜尋的對應元素值 範例
資料來源: chatgpt
C#線上編譯: https://dotnetfiddle.net/
範例功能:
01.可以全域搜尋 : “”
02.可以指定根節點 : “OOXX”
03.可以匹配多次(全部找出來)
03.可以模糊/精確搜尋 : 包含字串
Code
using System; using System.Collections.Generic; using System.Text.Json; class Program { static void Main() { string json = @"{ ""name"": ""John"", ""age"": 30, ""email"": ""john@example.com"", ""address"": { ""city"": ""New York"", ""zip"": ""10001"" }, ""previousCities"": [ { ""city"": ""Los Angeles"" }, { ""city"": ""Chicago"" } ] }"; string searchKey = "city"; string startPath = "";//address//previousCities//previousCities[0] // 指定從哪個節點開始搜尋 bool partialMatch = false; using JsonDocument doc = JsonDocument.Parse(json); JsonElement root = doc.RootElement; if (TryGetElementAtPath(root, startPath, out JsonElement startElement)) { var results = new Dictionary<string, string>(); FindInElement(startElement, searchKey, results, partialMatch, "$" + (startPath != "" ? "." + startPath : "")); if (results.Count > 0) { Console.WriteLine($"在 '{startPath}' 節點下找到與 '{searchKey}' {(partialMatch ? "(模糊)" : "(精確)")} 相符的鍵:"); foreach (var match in results) { Console.WriteLine($" {match.Key} => {match.Value}"); } } else { Console.WriteLine($"
在 '{startPath}' 中找不到 '{searchKey}'"); } } else { Console.WriteLine($"
找不到指定路徑:{startPath}"); } } // 主搜尋邏輯 static void FindInElement(JsonElement element, string searchKey, Dictionary<string, string> results, bool partialMatch, string currentPath) { switch (element.ValueKind) { case JsonValueKind.Object: foreach (JsonProperty prop in element.EnumerateObject()) { string newPath = $"{currentPath}.{prop.Name}"; bool isMatch = partialMatch ? prop.Name.Contains(searchKey, StringComparison.OrdinalIgnoreCase) : prop.NameEquals(searchKey); if (isMatch && !results.ContainsKey(newPath)) results.Add(newPath, prop.Value.ToString()); FindInElement(prop.Value, searchKey, results, partialMatch, newPath); } break; case JsonValueKind.Array: int index = 0; foreach (JsonElement item in element.EnumerateArray()) { string newPath = $"{currentPath}[{index}]"; FindInElement(item, searchKey, results, partialMatch, newPath); index++; } break; } } // 根據 JSON 路徑取出對應 JsonElement static bool TryGetElementAtPath(JsonElement root, string path, out JsonElement result) { result = root; if (string.IsNullOrEmpty(path)) return true; string[] parts = path.Split('.', StringSplitOptions.RemoveEmptyEntries); foreach (string part in parts) { if (result.ValueKind == JsonValueKind.Object) { string key = part; int bracketIndex = part.IndexOf('['); if (bracketIndex != -1) { key = part[..bracketIndex]; } if (!result.TryGetProperty(key, out result)) return false; if (bracketIndex != -1) { if (!TryParseArrayAccess(ref result, part[bracketIndex..])) return false; } } else if (result.ValueKind == JsonValueKind.Array) { if (!TryParseArrayAccess(ref result, part)) return false; } else { return false; } } return true; } static bool TryParseArrayAccess(ref JsonElement element, string bracketPart) { while (bracketPart.StartsWith("[")) { int endBracket = bracketPart.IndexOf(']'); if (endBracket == -1) return false; string indexStr = bracketPart[1..endBracket]; if (!int.TryParse(indexStr, out int index)) return false; if (element.ValueKind != JsonValueKind.Array || element.GetArrayLength() <= index) return false; element = element[index]; bracketPart = bracketPart[(endBracket + 1)..]; } return true; } } /*
在 '' 節點下找到與 'city' (精確) 相符的鍵: $.address.city => New York $.previousCities[0].city => Los Angeles $.previousCities[1].city => Chicago */