2016-07-27 8 views
0

この質問は不正なものだと思ったので、私は「姉妹」の質問を作成しました。参照先: Querying JSON Nested Arrays with Linq, JSON.NET, C# この質問の前に回答が得られたら、私はこの質問に答えてみるつもりです:)感謝!階層型JSONからの単純なプロパティの取り出しパート2

以前の質問(Picking Out Simple Properties from Hierarchical JSON)では、階層型JSONから簡単なプロパティを取得する方法を尋ねました。その答えは、[この記事の最後にLinqのクエリとして貼り付けた] extremently有用です(そして、それを掲示して以来、私はLinqとJSON.NETについてかなり研究してきました)。だから私は怠け者だからこのフォーラムを使っていません - 私が本当に立ち往生していて、私がアクセスできる本の中で答えを見つけることができないようなときに私はそれを使用します。

私の前の質問で提供されている例を続ける方法がわかりません。この質問は前のものをベースにしていますので、ここでは簡潔に(私が表現することができるように)、私はLinqの1つのクエリでやる方法を学びたいと思っています。

は以下にまとめます。私はこのようなダイナミックなJSON(それは配列を含んでいるので、それは私が疑問私の以前のパートで提示JSONよりも複雑である)で働いています:

{ 
    "Branch1": { 
     "Prop1A": "1A", 
     "Prop1B": "1B", 
     "Prop1C": "1C", 
     "Branch2": { 
      "Prop2A": "2A", 
      "Prop2B": "2B", 
      "Prop2C": "2C", 
      "Branch3": [{ 
       "Prop3A": "3A", 
       "Prop3B": "3B", 
       "Prop3C": "3C" 
      }, { 
       "Prop3D": "3D", 
       "Prop3E": "3E", 
       "Prop3F": "3F" 
      }, { 
       "Prop3G": "3G", 
       "Prop3H": "3H", 
       "Prop3I": "3I" 
      }] 
     }, 
     "Branch4": [{ 
      "Prop4A": "4A", 
      "Prop4B": "4B", 
      "Prop4C": "4C" 
     }, { 
      "Prop4E": "4E", 
      "Prop4F": "4F", 
      "Prop4G": "4G" 
     }, { 
      "Prop4H": "4H", 
      "Prop4I": "4I", 
      "Prop4I": "4I" 
     }] 
    } 
} 

あなたは、見ることができるように動的JSONは階層オブジェクトで構成され、これらのオブジェクトはJSONオブジェクト、JSON配列、JSONプロパティです。

最終的に、私はこのJSONをC#で扱えるListオブジェクトに変換したいと考えています。そのListオブジェクトを使用して、各JSONブランチをドキュメントの順序で上から下へ効率的に処理する予定です。

Listコレクションの各項目はJObjectになります。これらのオブジェクトのそれぞれには、元のJSONにそのJObjectが表示されるブランチを指す合成「親」文字列プロパティがあります(下の私の例では、「親」という意味を説明しています)。 [前の質問は正しく、この親の値の解決策を思いついたので、この質問にはあまり関係がありません... JSONのJArrayオブジェクトを扱うのは新しく/関連しています...]

キーは、各List Itemオブジェクトにオブジェクトの文字列値のプロパティのみを格納させることです。たとえば、Branch1にはProp1A、1B、および1Cの文字列プロパティがあります。したがって、私は、クエリ[0]含むようにしたいと思う:

{"Prop1A":"1A","Prop1B":"1B","Prop1C":"1C", Parent:""} 

次に、私は、クエリ[2]支社のための文字列値の特性を含むようにしたいと思う:

{"Prop2A":"2A","Prop2B":"2B","Prop2C":"2C", Parent:"Branch1"} 

次へ]を、私はしたいと思いますクエリ[2]のみBranch3のための文字列プロパティを含むように、しかしBranch3は、オブジェクトの配列ですので、私はその配列がクエリで一緒に終わるしたい[2]:この支店はdoesnのこと

[ 
{"Prop3A": "3A","Prop3B": "3B","Prop3C": "3C"}, 
{"Prop3D": "3D","Prop3E": "3E","Prop3F": "3F"}, 
{"Prop3G": "3G","Prop3H": "3H","Prop3I": "3I"} 
] 

は注意してください」それでも、その "Paレンタル "...私は上記のようなクエリ[2]の配列を取得してうれしいです。 (私は、配列の各要素に「親」プロパティを追加または配列が含まれており、一度だけ親を引き合いに出して新しいjオブジェクトを作成する方法を把握するDBCのロジックを使用する予定):

[{"Prop3A": "3A","Prop3B": "3B","Prop3C": "3C","Parent":"Branch2"}, 
{"Prop3D": "3D","Prop3E": "3E","Prop3F": "3F","Parent":"Branch2"}, 
{"Prop3G": "3G","Prop3H": "3H","Prop3I": "3I","Parent":"Branch2"} 
] 

だから、として *クエリ結果に新しいJObjectとして配列の配列ではないJSONブランチがあれば、その文字列のプロパティとその親ブランチへの参照だけを入れたいと思っています。 *配列であるJSONブランチを、クエリ結果に文字列プロパティと親ブランチへの参照とともに新しいJObject配列として挿入することをお勧めします。

私自身でこれを解決しなければならなかった問題は、Linqで "if myJsonObject is JArray"条件を作成し、分岐が配列ではなく、文字列プロパティのプロパティを割り当てる方法を考え出すことと関係しています配列の要素がJArrayである場合私は何とかそれを活用する必要があると思う? :三項表現ですが、私はそれをどうやって行うのか正確には分かりません。

前の質問からの問合せはこちらです:

var query3 = from o in root.DescendantsAndSelf().OfType<JObject>()  // Find objects 
      let l = o.Properties().Where(p => p.Value is JValue)  // Select their primitive properties 
      where l.Any()            // Skip objects with no properties 
      // Add synthetic "Parent" property 
      let l2 = l.Concat(new[] { new JProperty("Parent", o.Ancestors().OfType<JProperty>().Skip(1).Select(a => a.Name).FirstOrDefault() ?? "") }) 
      select new JObject(l2);         // And return a JObject. 

var list3 = query3.ToList(); 

コードは、上記の方法で配列を処理していないこと。

ありがとうございます!

+1

あなたのクエリ[2] '、簡素化へ' { \t [ "Prop3A" 'のためのJSONを提案した: "3A" ]、 "親": "Branch2" } 'は無効です。 [標準](http://www.json.org/)から、JSONコンテナは、オブジェクト - 中括弧で囲まれた名前/値の組の順序付けられていないセット、または配列 - 括弧で囲まれた順序付けられた値のセットです。提案されたJSONには値があり、その後に名前と値のペアがあります。 http://jsonlint.com/にアップロードすると、問題が表示されます。 – dbc

+0

申し訳ありません - 私は疲れていて、JSONを完全に嫌っていました(私は通常JSLintを使用しますが、このケースでは...)TYと問題で修正されました... – Jazimov

答えて

関連する問題