2016-10-14 7 views
0

私は、JSONのパスに新たなんだ、これはそれも可能だ場合、私は、期待するよりも簡単かもしれません。JSONパス:値と親を出力するには、階層的に

Iは、各グループが、フィールドのセットを有する、グループの集合から成るJSONブロックを有しています。各グループには、各フィールドと同様にシーケンスがあります。フィールドシーケンスはグループ内の順序を表し、グループシーケンスはグループ自体の表示順序を表します。

、私のグループ化アルゴリズムを私は別のシーケンス値を持つアイテム(グループやフィールド)のフラットリストのオフC#でプログラム的にこれを生成したので、私は拡張子によって、私の出力を検証したいです。

このようなJSONブロックルックス(大幅に単純化された):私は、JSONのパスでこれを検証しようとしている

{ 
    "groups": [ 
    { 
     "sequence": 0, 
     "fields": [ 
     { 
      "sequence": 0 
     }, 
     { 
      "sequence": 1 
     }, 
     { 
      "sequence": 2 
     } 
     ] 
    }, 
    { 
     "sequence": 1, 
     "fields": [ 
     { 
      "sequence": 0 
     }, 
     { 
      "sequence": 1 
     } 
     ] 
    }, 
    { 
     "sequence": 2, 
     "fields": [ 
     { 
      "sequence": 0 
     }, 
     { 
      "sequence": 1 
     }, 
     { 
      "sequence": 2 
     } 
     ] 
    } 
    ] 
} 

。このため、ツールはないので、jsonpath online evaluatorを使用しています。

私は何を目指していますが、この線に沿って出力されています、私は各グループの順序プラスのシーケンスを返すことができますJSONパスクエリのために言い換える

'0' 
    'sequence' => '0' 
    'fields'... 
     '0' 
     'sequence' => '0' 
     '1' 
     'sequence' => '1' 
     '2' 
     'sequence' => '2' 
// etc... 

探していますグループ内の各フィールドは、階層内にあります。

グループのシーケンスを取得するには、私は以下を使用しています。

$.groups[*].sequence

は出力::

'0' => "0" 
'1' => "1" 
'2' => "2" 

グループ内のフィールドの順序を取得するには、私は、グループがすでにトップレベルのアイテムですので、これは、正常に動作し、私に有用な出力を提供します次のようにしてください。それは私が数十または複数のグループにまたがって複数のフィールドを持っている場合、読み取りが困難得ることができるフラットなリストだとして、ここでの出力は、あまり有用です。

$.groups[*].fields[*].sequence

出力:

'0' => "0" 
'1' => "1" 
'2' => "2" 
'3' => "0" 
'4' => "1" 
'5' => "0" 
'6' => "1" 
'7' => "2" 

だから、最終的には、質問はこれです:私は、階層的に、ここで必要な情報を取得できるようになるJSONパスクエリがありますか?あるいは私は仕事のために間違ったツールを使用していますか? JSONパスが学習する強力なツールかもしれないようなので、JavaScriptを使ってコードを書くことができると思いますが、ここでやることができれば何かを学びました。

+0

try '$ .groups [*]。[sequence] ' – fingerpich

答えて

1

あなたは可変配列を必要としません。シーケンスが必要なときは、あるグループから別のグループにアイテムを移動し、オブジェクト内の配列を使用してソートし、配列内のオブジェクトをソートします。

アレイは、ソート、アイテムの移動、シーケンスの変更に使用します。単一項目内の属性をグループ化するオブジェクト

var groups = 
    [ 
    {"fields": [ 
     {name: 'field1'}, 
     {name: 'field2'}, 
     {name: 'field3'} 
     ], 
    }, 

    {"fields": [ 
     {name: 'field1'}, 
     {name: 'field2'}, 
     {name: 'field3'} 
     ] 
    }, 

    {"fields": [ 
     {name: 'field1'}, 
     {name: 'field2'}, 
     {name: 'field3'} 
     ] 
    } 
    ]; 
console.log(groups[0].fields);   // Array [ Object, Object, Object ] 
console.log(groups[2].fields[0].name); // field1 

Function spliceは、シーケンスを変更するのに最適です。同じフィールド内および別のフィールド内 同じフィールド内の変更シーケンスの例

var oldIndex = 2, newIndex = 0, item = groups[0].fields.splice(oldIndex, 1)[0]; 
console.log(item); 

groups[0].fields.splice(newIndex, 0, item); 
console.log(groups); 
+0

これは意味がありますが、元の質問は、私は単一のJSONパスステートメントでこれを行うことができますか?確かに、私は必要な情報を得るためにJavaScriptを書くことができますが、私はここでも新しいことを学ぼうとしています。 :) –