2017-07-21 5 views
0
{"type" : "Something", 
"values" : [ 
{ "type": "Something else", 
    "Categories": { 
     "values": [ "Grocery" ]}, 
    "Origin": { 
     "values": [ 
      { 
      "Name": "Chicken", 
      "State": "Texas", 
      "Quantity": "200", 
      "Year" : "2017" }], 
    "Primaryprovider": "Farmer", 
    "Name": "EggsGrocery" 
}, 
{ 
    "type": "Something else", 
    "categories": { 
     "values": [ "Utensil" ]}, 
    "Origin": { 
     "values": [ 
      { 
      "Name": "Cutlery", 
      "State": "Alaska", 
      "Quantity": "109", 
      "Year" : "2015" }], 
    "Primaryprovider": "Welder", 
    "Name": "UtensilSpoon" 
}]} 

カテゴリに名前が一致する辞書があります。だから私はPrimaryProvidersを取得しようとすると、これを取得します。Enumerable + WhereSelectEnumerableIterator`2エラーとLINQ文を使用してJObjectの値を取得する

System.Linq.Enumerable+WhereSelectEnumerableIterator`2[Newtonsoft.Json.Linq.JToken,Newtonsoft.Json.Linq.JToken] 

私が間違っていることを指摘してください。状態がテキサスでLINQ式の場合は、名前、州、および年のOrigin値をどのように取得できますか?私はLINQにあまり堪能ではありませんので、私は本当にそこでの短い説明に感謝します。私はそれのためにJTokenを使い始めました。それは悪い考えです。 助けてください。ありがとう!

foreach (var kvp in catDict) 
     { 
      string cat = kvp.Key; 
      List<string> Names = new List<string>(); 
      Names.AddRange(kvp.Value); 
      for (int i = 0; i < Names.Count; i++) 
      { 
       //if the name contains the name of the category 
       if (Names[i].Contains(cat)) 
       { 
        //get primaryprovider 
        string primaryprover = json["values"].Select(pk => pk.SelectToken("Primaryprovider")).ToString(); 

      // get the Origin Name, State & year if the state is Texas 
      // foreach (var jent in json["values"]) 
       //{ 
        //if (jentity["Origin"]["State"] == "Texas") 
       //} 

        Console.WriteLine(primaryprovider); 
       } 
+1

'Enumerable + WhereSelectEnumerableIterator \' 2'は「エラー」ではありません。これは、 'Select()'の結果に対して 'ToString()'によって返される文字列です。 'ToString'があなたが得た型に対してオーバーライドされないとき、それは名前です。この場合、ネストされた型があります( 'WhereSelectEnumerableIterator'は' Enumerable'クラスのネストされたクラスです)。 2( '\' 2')の汎用引数も含まれています。これはあなたの質問に対する答えではありません。私はこれを指摘しているので、これらの謎の文字列を将来認識することができます。 – pinkfloydx33

+0

JSONは検証されません。 [jsonlint.com](https://jsonlint.com/)で確認してください。 –

答えて

1

免責事項:すべてのコードが提供されているわけではないので、私はオブジェクトについていくつかの仮定をしなければなりません。たとえば、catDictの一般的な引数は何ですか?

目立つ点の1つは、string primaryProviderはループ変数を使用しないことです。つまり、常に同じ値を返します。

しかし私の助言は、バックアップして別のアプローチを取ることです。 Deserialize your json into a list of objects(データ契約を最初に作成する必要があります)。それが終わったら、あなたが議論した操作の方法は非常に簡単です。下記は用例です。

//get and declare seralizer, then deserialize 
List<Item> items = serializer.Deserialize<Item>().ToList(); 

//find a specific item by name 
string searchName = "UtensilSpoon"; 
var mySearchItem = items.FirstOrDefault(i => i.Name == searchName); //null if not found 

//get all the items from a given primary provider 
string primaryProvider = "Farmer"; 
var mySearchItems = items.Where(i => i.Primaryprovider == primaryProvider); 

//get all the items in a given category 
string category = "Grocery"; 
var itemsInCategory = items.Where(i => i.Categories.Contains(category)); 

//get the origin object for items in a given state 
string state = "Texas"; 
var texasItems = items.Where(i => i.Origin.State == state); 

//print out the item name, state, and year for texas items only 
string state = "Texas"; 
foreach (var item in items.Where(i => i.Origin.State == state)) //(var item in texasItems) would also work 
{ 
    Console.WriteLine(item.Name); 
    Console.WriteLine(item.Origin.State); 
    Console.WriteLine(item.Origin.Year); 
} 
関連する問題