2016-10-14 2 views
0

Я новичок в JSON Path, поэтому это может быть проще, чем я ожидаю, если это возможно.Путь JSON: значение вывода плюс родительский иерархический

У меня есть блок JSON, который состоит из набора групп, причем каждая группа имеет набор полей. Каждая группа также имеет последовательность, как и каждое поле. Последовательность полей представляет порядок внутри группы, а групповая последовательность представляет порядок отображения самой группы.

Я сгенерировал это программно в C# из плоского списка элементов (групп и полей) с разными значениями последовательности, поэтому я хочу проверить свой вывод и, в добавок, свой алгоритм группировки.

В 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 
     } 
     ] 
    } 
    ] 
} 

Я пытаюсь проверить это с помощью JSON Path. Для этого у меня нет инструмента, поэтому я использую jsonpath online evaluator.

Что я и добиваюсь выводится по линии этого:

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

Другими словами, я ищу для запроса пути JSON, который может вернуть последовательность каждой группы плюс последовательность каждое поле в группе, в иерархии.

Чтобы получить последовательность групп, я использую следующее. Это прекрасно работает, и дает мне полезный выход, поскольку группы являются элементом верхнего уровня уже:

$.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, который позволит мне получить информацию мне нужно здесь иерархически? Или я использую неправильный инструмент для работы? Полагаю, я мог бы написать несколько строк кода в JavaScript, которые позволят мне сделать это, если придется, но похоже, что путь JSON может стать мощным инструментом для изучения, поэтому, если я могу это сделать, я кое-что узнал.

+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, чтобы получить нужную мне информацию, но я тоже пытаюсь изучить новую вещь. :) –