首頁 >後端開發 >C++ >如何在巢狀 JObject 層次結構中按名稱有效定位 JToken?

如何在巢狀 JObject 層次結構中按名稱有效定位 JToken?

Linda Hamilton
Linda Hamilton原創
2025-01-03 17:15:39272瀏覽

How to Efficiently Locate JTokens by Name within Nested JObject Hierarchies?

在JObject 層次結構中按名稱定位JToken

為了回應從複雜JSON 回應中檢索特定JToken 的需求,本文提出了討論NewtonsoftJson庫中的可用選項,並以遞歸的形式提供替代解決方案

NewtonsoftJson SelectToken 方法

雖然NewtonsoftJson 庫不提供按名稱搜尋JToken 的直接方法,但它提供了SelectToken() 方法。此方法可讓您瀏覽 JObject 層次結構並根據令牌的路徑選擇令牌。例如,要從提供的JSON 回應中檢索「文字」JToken:

JObject jObject = JObject.Parse(json);
string distanceText = jObject.SelectToken("routes[0].legs[0].distance.text").ToString();

遞歸令牌搜尋方法

如果您需要尋找所有出現的JToken無論其位置如何,都具有特定的名稱,因此需要遞歸方法。這是一個範例:

public static class JsonExtensions
{
    public static List<JToken> FindTokens(this JToken containerToken, string name)
    {
        // Initialize a list to store matching JTokens
        List<JToken> matches = new List<JToken>();

        // Call the recursive helper method
        FindTokens(containerToken, name, matches);

        // Return the matches
        return matches;
    }

    private static void FindTokens(JToken containerToken, string name, List<JToken> matches)
    {
        // Recursively traverse the JObject and JArray elements
        switch (containerToken.Type)
        {
            case JTokenType.Object:
                // Check JProperties for the name and recurse on their values
                foreach (JProperty child in containerToken.Children<JProperty>())
                {
                    if (child.Name == name)
                    {
                        matches.Add(child.Value);
                    }
                    FindTokens(child.Value, name, matches);
                }
                break;
            case JTokenType.Array:
                // Recurse on each element of the array
                foreach (JToken child in containerToken.Children())
                {
                    FindTokens(child, name, matches);
                }
                break;
        }
    }
}

示範和輸出

這是一個範例示範:

// Load the JSON response
string json = GetJson();

// Parse the JSON into a JObject
JObject jo = JObject.Parse(json);

// Find all "text" JTokens using the FindTokens method
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() 方法提供了一種便捷的方法來導航JObject 中的特定路徑,但遞歸FindTokens 方法提供了用於查找具有給定名稱的JToken 的所有出現的解決方案,無論其在層次結構中的位置如何。這些方法之間的選擇取決於您應用程式的特定要求。

以上是如何在巢狀 JObject 層次結構中按名稱有效定位 JToken?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn