Осмотреть объект и выполнить модификации на всех соответствующих дочерних узлах

1

Я работаю с большим конфигурационным файлом JSON (кстати, сборкой запросов Postman/Newman API), и перед этим нужно выполнить некоторые изменения в приложении Node.

Пример конфигурации

let config = {
  "name": "API Requests",
  "item": [
    {
      "name": "Upload Data File",
      "body": {
        "formdata": [
          {
            "key": "filerename",
            "value": "./tests/fixtures/data.txt",
            "type": "text"
          }
        ]
      }
    },
    {
      "name": "Another Group",
      "item": [
        {
          "name": "Upload Profile Photo",
          "body": {
            "formdata": [
              {
                "key": "filerename",
                "value": "./tests/fixtures/profilephoto.png",
                "type": "text"
              },
              {
                "key": "anotherkey",
                "value": "1",
                "type": "text"
              }
            ]
          }
        }
      ]
    }
  ]
}

function updateFormdataObjects(config) {
  let updatedConfig;
  // Process the object here and rewrite each of the formdata entries as described below
  return updatedConfig;
}

Необходимые этапы

1) Найдите внутри config чтобы найти всех детей, которые содержат "key": "filerename"

2) Для каждого подходящего ребенка измените их ключи и значения следующим образом:

// Original object
{
  "key": "filerename",
  "value": "./tests/fixtures/anotherphoto.png",
  "type": "text"
}

// Updated object
{
  "key": "file",                               // change the value from "filerename" to "file"
  "src": "./tests/fixtures/anotherphoto.png",  // change the key from "value" to "src"
  "type": "file"                               // change the value from "text" to "file"
}

3) После завершения верните весь измененный объект.

Заметки

  • В основном объекте может быть много соответствующих детей. Все они должны быть обработаны.
  • Объект может иметь бесконечные уровни вложенности, поэтому функция должна учитывать это.
  • Функция должна возвращать один измененный объект, который затем может быть использован в другом месте
  • Я запускаю этот скрипт как часть приложения Node с ES6, поэтому можно максимально использовать возможности
  • 0
    Вы просто находите и заменяете текст в файле JSON? Разве вы не можете использовать текстовый редактор, такой как Sublime, VSCode и т. Д.?
  • 0
    @DannyDainton К сожалению, нет, потому что набор запросов (их около 400) обновляется довольно регулярно и экспортируется в JSON. Затем этот сценарий должен обработать этот файл JSON и внести необходимые изменения перед запуском Newman в CLI. Приведенный выше пример представляет собой сокращенную версию реальной конфигурации;)
Показать ещё 2 комментария
Теги:
postman
newman

1 ответ

1

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

function replaceFilePaths(input) {
    let modified = JSON.stringify(input);
    modified = modifiedCollection.replace(/{\"key\":\"filekey\[(.*?)\]\",\"value\":\"(.*?)\",\"type\":\"text\"}/mg, '{"key":"\$1","src":"\$2","type": "file"}')
    return JSON.parse(modified);
}

Я также сделал настройку, позволяющую немного настроить конфигурацию по имени ключа, разрешив передать имя ключа, например filekey[file_url] и превратить это в "key": "file_url".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню