【解決方法】jtokenでjobjectの配列から複数の値を取得してリストに格納する方法


こんにちは、現在私は、各メッセージが json エンコードされたオブジェクトであるトランスポート プロトコルとして websocket に基づく API と通信している WinForms アプリケーションに取り組んでいます。 params JArray の各配列をループし、すべての名前フィールドの値を取得して、これらすべての値を 1 つのリストに格納したいと考えています。 だからここに私が試したことがあります:

私が試したこと:

1. サーバーからの応答メッセージを文字列で示します。

C#
string receivedResult = "{\"method\":\"_result\",\"params\":[[{\"idmake\":1,\"name\":\"Abarth\",\"important\":0,\"description\":{\"DE\":\"Abarth & C. S.p.A., Corso Giovanni Agnelli 200, I – 10135 Torino, Italia.\\nwww.abarth.it\\nGegründet 1949 von Carlo Abarth. Seit 2007 Teil von Fiat zur Produktion und Vertrieb von sportlichen Versionen von Fiat-Modellen.\",\"EN\":\"Abarth & C. S.p.A., Corso Giovanni Agnelli 200, I – 10135 Torino, Italy.\\nwww.abarth.it\",\"ES\":\"Abarth & C. S.p.A., Corso Giovanni Agnelli 200, I – 10135 Torino, Italia.\\nwww.abarth.it\",\"FR\":\"Abarth & C. S.p.A., Corso Giovanni Agnelli 200, I – 10135 Torino, Italie.\\nwww.abarth.it\",\"PO\":\"Abarth & C. S.p.A., Corso Giovanni Agnelli 200, I – 10135 Torino, Itàlia.\\nwww.abarth.it\"},\"doneyears\":[[1955,1961],[1963,1971],[2008,2020]]},{\"idmake\":2,\"name\":\"AC\",\"important\":0,\"description\":{\"DE\":\"AC Cars, Siemensstrasse, 75334 Straubenhart, Deutschland.\\nwww.ac-automotive.com\\nGegründet 1911 in Grossbritannien. Fertigung des Mk VI heute in Heya, Deutschland.\",\"EN\":\"AC Cars, Siemensstrasse, 75334 Straubenhart, Germany.\\nwww.ac-automotive.com\",\"ES\":\"AC Cars, Siemensstrasse, 75334 Straubenhart, Alemania.\\nwww.ac-automotive.com\",\"FR\":\"AC Cars, Siemensstrasse, 75334 Straubenhart, Allemagne.\\nwww.ac-automotive.com\\nCréée en 1911, en Grande Bretagne. Fabrication de la Mk VI aujourd'hui à Heya, Allemagne.\",\"PO\":\"AC Cars, Siemensstrasse, 75334 Straubenhart, Alemanha.\\nwww.ac-automotive.com\"},\"doneyears\":[[1948,1963],[1966,1991],[1993,1996],[2000,2003],[2007,2008],[2010,2019]]},{\"idmake\":3,\"name\":\"Acura\",\"important\":0,\"description\":{\"DE\":\"Acura Division, American Honda Motor Co., Inc., 1919 Torrance Boulevard, Torrance, California 90 501.2746, USA.\\nwww.acura.com\\nSeit 1986 als Premium-Marke von Honda auf dem amerikanischen Markt mit eigenständigen Modellen.\",\"EN\":\"Acura Division, American Honda Motor Co., Inc., 1919 Torrance Boulevard, Torrance, California 90 501.2746, USA.\\nwww.acura.com\",\"ES\":\"Acura Division, American Honda Motor Co., Inc., 1919 Torrance Boulevard, Torrance, California 90 501.2746, EE. UU.\\nwww.acura.com\",\"FR\":\"Acura Division, American Honda Motor Co., Inc., 1919 Torrance Boulevard, Torrance, California 90 501.2746, USA.\\nwww.acura.com\\nDepuis 1986, marque haut de gamme de Honda sur le marché américain, avec ses propres modèles.\",\"PO\":\"Acura Division, American Honda Motor Co., Inc., 1919 Torrance Boulevard, Torrance, California 90 501.2746, EUA.\\nwww.acura.com\",\"RU\":null},\"doneyears\":[[1966,1966],[1988,1988],[1991,1991],[1996,2003],[2007,2020]]}";

2.次に行ったのは、次のステートメントでこの文字列を解析して JObject にすることです。

C#
var jObject = JObject.Parse(receivedResult);

3. 解析後、次のフォーマットされた出力が得られます。

C#
{
  "method": "_result",
  "params": [
    [
      {
        "idmake": 1,
        "name": "Abarth",
        "important": 0,
        "description": {
          "DE": "Abarth & C. S.p.A., Corso Giovanni Agnelli 200, I – 10135 Torino, Italia.\nwww.abarth.it\nGegründet 1949 von Carlo Abarth. Seit 2007 Teil von Fiat zur Produktion und Vertrieb von sportlichen Versionen von Fiat-Modellen.",
          "EN": "Abarth & C. S.p.A., Corso Giovanni Agnelli 200, I – 10135 Torino, Italy.\nwww.abarth.it",
          "ES": "Abarth & C. S.p.A., Corso Giovanni Agnelli 200, I – 10135 Torino, Italia.\nwww.abarth.it",
          "FR": "Abarth & C. S.p.A., Corso Giovanni Agnelli 200, I – 10135 Torino, Italie.\nwww.abarth.it",
          "PO": "Abarth & C. S.p.A., Corso Giovanni Agnelli 200, I – 10135 Torino, Itàlia.\nwww.abarth.it"
        },
        "doneyears": [
          [
            1955,
            1961
          ],
          [
            1963,
            1971
          ],
          [
            2008,
            2020
          ]
        ]
      },
      {
        "idmake": 2,
        "name": "AC",
        "important": 0,
        "description": {
          "DE": "AC Cars, Siemensstrasse, 75334 Straubenhart, Deutschland.\nwww.ac-automotive.com\nGegründet 1911 in Grossbritannien. Fertigung des Mk VI heute in Heya, Deutschland.",
          "EN": "AC Cars, Siemensstrasse, 75334 Straubenhart, Germany.\nwww.ac-automotive.com",
          "ES": "AC Cars, Siemensstrasse, 75334 Straubenhart, Alemania.\nwww.ac-automotive.com",
          "FR": "AC Cars, Siemensstrasse, 75334 Straubenhart, Allemagne.\nwww.ac-automotive.com\nCréée en 1911, en Grande Bretagne. Fabrication de la Mk VI aujourd'hui à Heya, Allemagne.",
          "PO": "AC Cars, Siemensstrasse, 75334 Straubenhart, Alemanha.\nwww.ac-automotive.com"
        },
        "doneyears": [
          [
            1948,
            1963
          ],
          [
            1966,
            1991
          ],
          [
            1993,
            1996
          ],
          [
            2000,
            2003
          ],
          [
            2007,
            2008
          ],
          [
            2010,
            2019
          ]
        ]
      },
      {
        "idmake": 3,
        "name": "Acura",
        "important": 0,
        "description": {
          "DE": "Acura Division, American Honda Motor Co., Inc., 1919 Torrance Boulevard, Torrance, California 90 501.2746, USA.\nwww.acura.com\nSeit 1986 als Premium-Marke von Honda auf dem amerikanischen Markt mit eigenständigen Modellen.",
          "EN": "Acura Division, American Honda Motor Co., Inc., 1919 Torrance Boulevard, Torrance, California 90 501.2746, USA.\nwww.acura.com",
          "ES": "Acura Division, American Honda Motor Co., Inc., 1919 Torrance Boulevard, Torrance, California 90 501.2746, EE. UU.\nwww.acura.com",
          "FR": "Acura Division, American Honda Motor Co., Inc., 1919 Torrance Boulevard, Torrance, California 90 501.2746, USA.\nwww.acura.com\nDepuis 1986, marque haut de gamme de Honda sur le marché américain, avec ses propres modèles.",
          "PO": "Acura Division, American Honda Motor Co., Inc., 1919 Torrance Boulevard, Torrance, California 90 501.2746, EUA.\nwww.acura.com",
          "RU": null
        },
        "doneyears": [
          [
            1966,
            1966
          ],
          [
            1988,
            1988
          ],
          [
            1991,
            1991
          ],
          [
            1996,
            2003
          ],
          [
            2007,
            2020
          ]
        ]
      }
    ]
  ],
  "seq": 100
}

フィールドのすべての値を取得したい 名前 配列で、これらすべての値をリストに保存すると、最初の配列から名前の値を取得できました。 アバルト 次のコードで:

C#
JArray paramsArray = (JArray)jObject["params"];
            List<string> listName = new List<string>();

            foreach(JToken param in paramsArray)
            {
                name = (string)param[0]["name"]; // Here I got the target result name="Abarth" from index 0 of array
                listName.Add(name);

                foreach(var item in listName)
                {
                    tbResultCreateNewAd.Text = item.ToString();
                }
                
            }

他の配列をループして名前の値を取得するにはどうすればよいでしょうか?

解決策 1

doneyears をプルする方法は次のとおりです。

C#
//List<string> listName = new List<string>();
Dictionary<string, Dictionary<int, int>> map
    = new Dictionary<string, Dictionary<int, int>>();

foreach(JToken param in paramsArray)
{
    string name = (string)param[0]["name"];

    Dictionary<int, int> tokens = new Dictionary<int, int>();

    foreach (JToken token in param[0]["doneyears"])
        tokens.Add((int)token.First(), (int)token.Last());

    map.Add(name, tokens);
}

解決策 2

while ループを通じて、子配列の最後のインデックス番号をハードコードしてから、すべての反復を実行します。これには別の解決策が存在する可能性がありますが、今のところ、このロジックはクリックイベントが適切に発生した後、コンボボックスがいっぱいになります。

 var jObject = JObject.Parse(receivedResult);
                JArray paramsArray = (JArray)jObject["params"];
                foreach(JToken param in paramsArray)
                {
                    int i = 0;
                    while(i<614) // 614 is hardcoded number for last array index
                    { 
                        name = param[i]["name"].ToString();
                        listName.Add(name);
                        i++;
                       
                    }
                    break;
                }
cbMake.DataSource = listName;

解決策 3

paramsArray variable は、JSON オブジェクトの配列ではなく、配列の配列です。 したがって、おそらく次のようなものが必要です。

Java
JArray paramsArray = (JArray)jObject["params"];
List<string> listName = new List<string>();

foreach(JToken param in paramsArray)
{
    foreach(JToken item in param) {
        name = (string)item["name"];
        listName.Add(name);
    }
}

// This loop needs to run after the previous two. But why do you need it at all, when you can add the names in the inner of the above two loops?
    foreach(var item in listName)
    {
        tbResultCreateNewAd.Text += item.ToString();
    }
    
}

解決策 4

Step 1: 

   dynamic response = JsonConvert.DeserializeObject(json);

Step 2: 

     JArray paramsArray = (JArray)JToken.FromObject(response);

Step 3: 

     foreach (JToken param in paramsArray)
                {
          CustomerRoot objCustomerRoot = param.ToObject<CustomerRoot>(); // Customer Root is class
         string CustomerID = objCustomerRoot.CustomerID.tostring();
                }

コメント

タイトルとURLをコピーしました