ホームページ >バックエンド開発 >C++ >Newtonsoft.Json JObject 階層内で JToken を名前で効率的に検索する方法

Newtonsoft.Json JObject 階層内で JToken を名前で効率的に検索する方法

DDD
DDDオリジナル
2025-01-04 13:39:39451ブラウズ

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 メソッドを使用すると、 text 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。