Json Patch удаляет вложенные элементы в массиве

Я хочу удалить вложенные элементы из массива, например

{
    "employees": [
        {
            "name": "name1",
            "id": "id1"
        },
        {
            "name": "name2",
            "id": "id2"
        },
        {
            "name": "name3",
            "id": "id3"
        }
    ]
}

И мне нужен патч, чтобы удалить все идентификаторы, чтобы я мог сделать что-то вроде этого

[{ "op": "remove", "path": "/employees/0/id"},
{ "op": "remove", "path": "/employees/1/id"},
{ "op": "remove", "path": "/employees/2/id"}]

Но есть ли способ указать подстановочный знак для выбора всех элементов id в массиве

1 ответ

Решение

Я смотрел на проект патча JSON, но ничего не нашел о регулярных выражениях. Одним из решений является использование некоторых JSON разбирать инструменты для его создания, такие как jq и python-json-patch. Первый удаляет все id ключи, а второй создает патч из diff, используемый как:

jq 'del(.employees[].id)' jsonfile | jsondiff jsonfile -

Это дает:

[{"op": "replace", "path": "/employees/2", "value": {"name": "name3"}}, 
 {"op": "replace", "path": "/employees/1", "value": {"name": "name2"}}, 
 {"op": "replace", "path": "/employees/0", "value": {"name": "name1"}}]

Используя также jsonpatch инструмент для применения патча, похоже, генерирует правильный вывод, например:

jq 'del(.employees[].id)' jsonfile | jsondiff jsonfile - | jsonpatch jsonfile -

Это дает:

{"employees": [{"name": "name1"}, {"name": "name2"}, {"name": "name3"}]}
Другие вопросы по тегам