2016-10-28 12 views
1

次JSONを考える:LINQのツーJSONクエリ

{ 
    "Data": { 
    "SPECIAL": "QQ01", 
    "AA": "QQ", 
    "BB": "QQ", 
    "Data": [ 
     { 
     "SPECIAL": "QQ02", 
     "AA": "QQ", 
     "BB": "QQ", 
     "CC": "QQ", 
     "Data": [ 
      { 
      "SPECIAL": "QQ03", 
      "AA": "QQ", 
      "CC": "QQ", 
      "Data": [ 
       { 
       "SPECIAL": "QQ04", 
       "AA": "QQ", 
       "CC": "QQ", 
       "Data": [ 
        { 
        "SPECIAL": "QQ05", 
        "AA": "QQ", 
        "CC": "QQ", 
        "Data": [ 
         { 
         "SPECIAL": "QQ06", 
         "AA": "QQ", 
         "CC": "QQ" 
         } 
        ] 
        }, 
        { 
        "SPECIAL": "QQ07", 
        "AA": "QQ", 
        "CC": "QQ", 
        "DD": "QQ", 
        "Data": [ 
         { 
         "SPECIAL": "QQ08", 
         "AA": "QQ", 
         "CC": "QQ", 
         "Data": [ 
          { 
          "SPECIAL": "QQ09", 
          "AA": "QQ", 
          "BB": "QQ", 
          "CC": "QQ" 
          } 
         ] 
         } 
        ] 
        } 
       ] 
       } 
      ] 
      } 
     ] 
     } 
    ] 
    } 
} 

を私は、私はJSONのプロパティは、単に名前/値のペアであることを理解思いました名前は文字列で、値は文字列、JArray、またはJObjectです。私が正しいとすれば、上記のサンプルJSONは、3つの兄弟プロパティ(SPECIAL、AA、BB)を含むData JObjectで開きます。

次のデータ入力がJArrayであることを確認します。配列の最初の要素には、SPECIAL、AA、BB、およびCCの4つのプロパティを持つオブジェクトが含まれています。

質問: QQ01に等しいSPECIALの兄弟プロパティを返すためにLinqクエリを発行するにはどうすればよいですか?戻り値は、SPECIAL:QQ01、AA:QQ、およびBB:QQのみを含むJPropertyのリストでなければなりません。これらのプロパティはJObject内にあることに注意してください。

SPECIALの4つの兄弟プロパティをQQ02と同じにしたい場合は、同じクエリを実行する必要があります。その場合、戻り値はSPECIAL:QQ02、AA:QQ、BB:QQ、およびCC:QQのみを含むJPropertyのリストになります。これらのプロパティは、JArrayにあるJObjectにあることに注意してください。

ああ、QQ01に等しいSPECIALのエントリが複数ある場合、または2番目のケースではQQ02に等しいSPECIALのエントリが複数ある場合は、最初のものだけが必要です。

ありがとうございます。ここで

答えて

3

が、私はそれを行うだろう方法は次のとおりです。

JObject jo = JObject.Parse(json); 

var props = jo.Descendants() 
    .OfType<JProperty>() 
    .Where(p => p.Name == "SPECIAL" && (string)p.Value == "QQ01") 
    .Take(1) 
    .Select(p => p.Parent) 
    .SelectMany(o => o.Children<JProperty>()) 
    .Where(p => p.Value.Type == JTokenType.String) 
    .ToList(); 

foreach (JProperty prop in props) 
{ 
    Console.WriteLine(prop.Name + ": " + prop.Value); 
} 

はフィドル:私はそれを見たらhttps://dotnetfiddle.net/nvIXkO

+0

、それは理にかなっています。とてもエレガントです。私はあなたが知識を共有するたびに多くを学んでいますが、JSON.NETとLinqで練習する必要があることは間違いありません。高い5人と多くのありがとう。 – Jazimov

+0

私は助けてよかった。 –