Путь в формате JSON: вывод значения плюс родительский иерархически

#javascript #json #jsonpath

#javascript #json #путь к jsonpath

Вопрос:

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

У меня есть блок 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. Для этого у меня нет инструмента, поэтому я использую онлайн-оценщик jsonpath.

То, к чему я стремлюсь, — это вывод в соответствии с этим:

 '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 path может быть мощным инструментом для изучения, поэтому, если я смогу сделать это здесь, я кое-чему научился.

Комментарии:

1. попробуйте $.groups[*].[sequence]

Ответ №1:

Вам не нужна переменная последовательность. Когда вам нужна последовательность, переместите элемент из одной группы в другую, сортировку вы можете использовать array в object и object в array.

Массив используется для сортировки, перемещения элементов, изменения последовательности. Возражает против группировки атрибутов в пределах одного элемента

 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
 

Объединение функций — лучший способ изменить последовательность. В тех же полях и в других полях
Пример последовательности изменений в тех же полях

 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);
 

Комментарии:

1. Это имеет смысл, но первоначальный вопрос заключается в том, могу ли я сделать это с помощью одного оператора пути JSON? Конечно, я могу написать JavaScript, чтобы получить необходимую мне информацию, но я и здесь пытаюсь научиться чему-то новому. 🙂