72230


C#初心者です。  
古いバージョンですが、C#の.NET Standard 2.0を使用しています。  
JSONを以下のようにParseして、Keyに"test1"や"names"が含まれているかを調べたいのですが、どうすればいいのかわかりません。以下の例ではうまく出力されませんでした。

Parse自体はうまく行っており、`parsedJson[0]["test1"]["names"][0].Value<string>()`
の中身は”aaa”と出力されました。

キーに特定の文字列が含まれているかどうか判定する場合、どのようにすれば良いか、わかる方がいたら教えてください。

[code]

    using Newtonsoft.Json.Linq;
    using System.Linq;
    using System;
    
    JArray parsedJson = JArray.Parse(@"[{""test1"":{""names"":[""aaa"",""bbb""]}},{""test2"":{""test"":[""ccc"",""ddd""]}}]");
    if(parsedJson[0].Contains(new JValue("test1")))
    {
        if(parsedJson[0]["test1"].Contains(new JValue("names")))
        {
            System.Console.WriteLine(parsedJson[0]["test1"]["names"][0].Value<string>());
        }
    }
    
[/code]


CC BY-SA 4.0
2020-11-26T10:39:05.570
72227
2020-11-26T23:17:14.910
2020-11-26T11:47:20.433
3060
36446
question
c# json
C#でJArrayのキーに特定の文字列が含まれているか調べる方法


JSONには型情報がないため、配列の先頭要素がディクショナリ（JSONオブジェクト）型であるかのテスト・型変換が必要です。[`as`演算子](https://docs.microsoft.com/ja-
jp/dotnet/csharp/language-reference/operators/type-testing-and-cast#as-
operator)を使用すると型変換を試み、成功すればその値が、失敗すれば`null`が得られる仕組みになっています。

[code]

    var array0 = parsedJson[0] as JObject;
    
[/code]

`JObject`に`test1`のキーが存在するかは[`JObject.TryGetValue`メソッド](https://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_Linq_JObject_TryGetValue.htm)が用意されています。存在すればその値が、存在しない場合は`null`が返されます。

[code]

    JToken test1Token;
    array0.TryGetValue("test1", out test1Token)
    
[/code]

これらを組み合わせたコード全体は

[code]

    var array0 = parsedJson[0] as JObject;
    JToken test1Token;
    if (array0 != null && array0.TryGetValue("test1", out test1Token)) {
        var test1 = test1Token as JObject;
        JToken namesToken;
        if (test1 != null && test1.TryGetValue("names", out namesToken)) {
            var names = namesToken as JArray;
            if (names != null)
                Console.WriteLine(names[0]);
        }
    }
    
[/code]

* * *

なお、[C# 7.0で機能強化](https://docs.microsoft.com/ja-jp/dotnet/csharp/whats-
new/csharp-7)が行われており、よりシンプルに記述できるようになっています。.NET Standard 2.0の場合、C#
7.3が使われるため以下の機能は使用可能です。

[code]

    if (parsedJson[0] is JObject array0 && array0.TryGetValue("test1", out var test1Token)) {
        if (test1Token is JObject test1 && test1.TryGetValue("names", out var namesToken)) {
            if (namesToken is JArray names)
                Console.WriteLine(names[0]);
        }
    }
    
[/code]

* * *

なお、[.NET Core 3.0以降では`System.Text.Json`が導入](https://docs.microsoft.com/ja-
jp/dotnet/standard/serialization/system-text-json-overview)されています。その上で.NET
Standard
2.0向けに[NuGetパッケージ`System.Text.Json`](https://www.nuget.org/packages/System.Text.Json)としてバックポートされています。こちらが標準機能ですので、可能であれば移行しておくことをお勧めします。

[code]

    using (var json = JsonDocument.Parse(@"[{""test1"":{""names"":[""aaa"",""bbb""]}},{""test2"":{""test"":[""ccc"",""ddd""]}}]")) {
        var parsedJson = json.RootElement;
        if (parsedJson.ValueKind == JsonValueKind.Array) {
            var array0 = parsedJson[0];
            if (array0.ValueKind == JsonValueKind.Object && array0.TryGetProperty("test1", out var test1)) {
                if (test1.ValueKind == JsonValueKind.Object && test1.TryGetProperty("names", out var names)) {
                    if (names.ValueKind == JsonValueKind.Array)
                        Console.WriteLine(names[0]);
                }
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2020-11-26T23:17:14.910
72230
2020-11-26T23:17:14.910
4236
72227
answer