首頁 > 後端開發 > C++ > 如何在 Newtonsoft.Json JObject 層次結構中按名稱高效搜尋 JToken?

如何在 Newtonsoft.Json JObject 層次結構中按名稱高效搜尋 JToken?

DDD
發布: 2025-01-04 13:39:39
原創
485 人瀏覽過

How to Efficiently Search for JTokens by Name within a Newtonsoft.Json JObject Hierarchy?

在JObject 層次結構中按名稱搜尋JToken

使用Newtonsoft.Json 庫處理JSON 資料時,可能會出現以下情況您需要在JObject 和JArray 的複雜層次結構中找到特定的JToken。這項任務可能會變得具有挑戰性,特別是當目標令牌的位置不明確時。

內建功能

雖然Newtonsoft.Json 函式庫沒有提供特定的功能與GetJTokenByName 等方法按名稱搜尋令牌不同,但它提供了另一種使用SelectToken 方法導航到令牌的方法。此方法可讓您遍歷 JObject 層次結構並根據令牌的路徑選擇令牌。例如,要取得嵌套距離屬性中文字標記的值,可以使用以下語法:

string distanceText = jObject.SelectToken("routes[0].legs[0].distance.text").ToString();
登入後複製

用於擴充搜尋的遞歸方法

如果您需要更全面的搜尋來識別具有給定名稱的標記的所有出現,則需要遞歸方法。這樣的方法應該探索 JObject 中的所有 JToken 和 JArray,包括巢狀結構。以下是 C# 中遞歸搜​​尋方法的潛在實作:

public static class JsonExtensions
{
    public static List<JToken> FindTokens(this JToken containerToken, string name)
    {
        List<JToken> matches = new List<JToken>();
        FindTokens(containerToken, name, matches);
        return matches;
    }

    private static void FindTokens(JToken containerToken, string name, List<JToken> matches)
    {
        if (containerToken.Type == JTokenType.Object)
        {
            foreach (JProperty child in containerToken.Children<JProperty>())
            {
                if (child.Name == name)
                {
                    matches.Add(child.Value);
                }
                FindTokens(child.Value, name, matches);
            }
        }
        else if (containerToken.Type == JTokenType.Array)
        {
            foreach (JToken child in containerToken.Children())
            {
                FindTokens(child, name, matches);
            }
        }
    }
}
登入後複製

示範和輸出

要示範遞歸方法,請考慮以下 JSON 回應:

{
    "routes": [
        {
            "bounds": {...},
            "legs": [
                {
                    "distance": { "text": "1.7 km", "value": 1729 },
                    "duration": {...}
                },
                {
                    "distance": { "text": "2.3 km", "value": 2301 },
                    "duration": {...}
                }
            ]
        }
    ]
}
登入後複製

使用遞歸FindTokens方法,可以搜尋文字的所有實例token:

foreach (JToken token in jo.FindTokens("text"))
{
    Console.WriteLine(token.Path + ": " + token.ToString());
}
登入後複製

這將輸出以下內容:

routes[0].legs[0].distance.text: 1.7 km
routes[0].legs[0].duration.text: 4 mins
routes[0].legs[1].distance.text: 2.3 km
routes[0].legs[1].duration.text: 5 mins
登入後複製

結論結論

透過使用SelectToken等內建方法或實作遞歸搜尋演算法,可以有效地在複雜的 JSON 結構中定位特定的 JToken。方法的選擇取決於 JSON 層次結構的複雜性和目標標記出現的頻率。

以上是如何在 Newtonsoft.Json JObject 層次結構中按名稱高效搜尋 JToken?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板