#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, чтобы получить необходимую мне информацию, но я и здесь пытаюсь научиться чему-то новому. 🙂