Сохраните контейнеры вместе со значениями

Результат состоит из containers и values. В containers записываются типы object и array, включая пустые объекты и массивы. В values находятся конечные строки, числа, логические значения и null. Пустой путь обозначает корень документа, а последующие части отделяются косой чертой.

Не превращайте результат в простой словарь «путь — значение»: так пропадёт информация о пустом массиве меток. Имена путей используют JSON Pointer. В имени поля знак ~ записывается как ~0, а / как ~1; точки в названии поля остаются обычными точками, а не разделителем вложенности.

Товар и пустой список меток
Исходные данные
{"товары":[{"id":"001","цена":250}],"метки":[]}
Результат
{
  "containers": {
    "": "object",
    "/товары": "array",
    "/товары/0": "object",
    "/метки": "array"
  },
  "values": {
    "/товары/0/id": "001",
    "/товары/0/цена": 250
  }
}

Тип массива и пустой контейнер сохранены отдельно от конечных значений.

Восстанавливайте только согласованную карту

Обратный инструмент принимает тот же формат containers/values. Сохраните корневой контейнер и родителей каждого пути. Один путь не может одновременно обозначать контейнер и конечное значение. В массивах нужны последовательные индексы без пропусков; 01 не считается допустимой записью индекса 1.

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

Список имён из типизированной карты
Исходные данные
{"containers":{"":"object","/имена":"array"},"values":{"/имена/0":"Анна","/имена/1":"Борис"}}
Результат
{
  "имена": [
    "Анна",
    "Борис"
  ]
}

Контейнер /имена явно отмечен как array, индексы идут подряд с нуля.

Извлеките значение по точному JSON Pointer

Для первой цены укажите /товары/0/цена. Индексы массива начинаются с нуля. Синтаксис $.товары[0] относится к другой системе адресации и здесь не поддерживается. Отсутствующий путь вызывает ошибку; он не становится автоматически null или пустой строкой.

Цена первого товара
Исходные данные
{"товары":[{"id":"001","цена":250}]}
Результат
250

Указанный JSON Pointer: /товары/0/цена. Пустой указатель выбрал бы весь документ.

Удаляйте поля по имени и выбранной глубине

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

Это не полноценное обезличивание. Секрет может храниться под другим именем, внутри обычной строки или в ещё одном поле. Проверяйте полученный документ перед передачей. Общие пределы: 200 000 символов ввода, 64 уровня вложенности и 30 000 узлов; произвольные JSONPath-запросы не выполняются.

Удаление одноимённого служебного поля
Исходные данные
{"token":"пример","профиль":{"token":"тест","город":"Москва"}}
Результат
{
  "профиль": {
    "город": "Москва"
  }
}

Ключ token, рекурсивное удаление включено. Это пример, а не проверка всех возможных секретов.

  1. Сохраните исходный JSON для сравнения.
  2. Выберите точный путь или точные имена удаляемых ключей.
  3. Проверьте режим рекурсии перед изменением.
  4. Сверьте структуру, значения и оставшиеся чувствительные поля вручную.

Вопросы и ответы

Почему в результате есть containers и values?

Типы контейнеров позволяют восстановить массивы, объекты и пустые структуры. Одних конечных значений для этого недостаточно.

Как выбрать поле, в имени которого есть косая черта?

В части JSON Pointer замените / на ~1, а ~ на ~0. Например, имя a/b~c адресуется как /a~1b~0c.

Поддерживается ли запрос $.товары[0].цена?

Нет, здесь используется JSON Pointer, а не JSONPath. Укажите /товары/0/цена с индексом массива от нуля.

Можно ли пропустить индекс массива при восстановлении?

Нет, разреженные или некорректные индексы отклоняются. Сохраняйте последовательность элементов без пропусков.

Удаление token гарантирует обезличивание документа?

Нет, удаляются только указанные имена полей. Проверьте остальные поля и текстовые значения перед передачей результата.

Почему отсутствующее поле не возвращается как null?

Отсутствие пути и существующее значение null различаются. Инструмент сообщает ошибку для пути, которого нет в документе.