首頁 >後端開發 >C++ >如何從 JObject 層次結構中以名稱有效率地檢索特定 JToken?

如何從 JObject 層次結構中以名稱有效率地檢索特定 JToken?

Linda Hamilton
Linda Hamilton原創
2025-01-04 15:30:41550瀏覽

How to Efficiently Retrieve Specific JTokens by Name from a JObject Hierarchy?

按名稱遍歷JObject 層次結構以查找特定令牌

問題:

給出JSON 回應對於複雜的JToken 層次結構,如何透過其檢索特定的JToken高效命名?

Newtonsoft.Json 內建函數:

Newtonsoft.Json 提供 SelectToken() 方法,該方法允許根據令牌的路徑直接導航到令牌。例如:

JToken distance = jObject.SelectToken("routes[0].legs[0].distance.text");

這將擷取表示距離文字值的 JToken。

遞歸搜尋:

如果令牌的路徑未知或您需要尋找具有給定名稱的標記的所有出現,則需要遞歸搜尋。這是用於遞歸搜索的自定義輔助方法:

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);
            }
        }
    }
}

用法:

string json = @"...", jo = JObject.Parse(json);

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

以上是如何從 JObject 層次結構中以名稱有效率地檢索特定 JToken?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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