Слияние двух выражений JSONata - PullRequest
4 голосов
/ 25 сентября 2019

Я использую JSONata для выполнения преобразования JSON в JSON.

По некоторым уникальным причинам я хочу объединить два выражения JSONata:

Как пример:

Родительское выражение:

var script = `
{
      "data":
      {
          "name" : data.payload.Name.(FirstName & ' ' & LastName),    
          "alias": data.payload.Name.(Salutation & ' ' & FirstName),
          "active": data.payload.Status = 'New' ? true : false,
          "signature": "Have good day ," & data.payload.Name.FirstName & "!"
       }       
  }
`;

Также у меня есть несколько простых типов присваивания выражения JSONata, таких как:

Выражение 1:

{
   "source" : source
}

Выражение 2:

{
  "data": {
     "email" : data.payload.Email
   }
}

Я хотел бы добавить два выше выражения к выражениям, определенным с использованием script.

Так что после добавления этих двух выражений,Я должен быть в состоянии получить:

var script = `
{
      "source": source,
      "data":
      {
          "name" : data.payload.Name.(FirstName & ' ' & LastName),    
          "alias": data.payload.Name.(Salutation & ' ' & FirstName),
          "active": data.payload.Status = 'New' ? true : false,
          "signature": "Have good day ," & data.payload.Name.FirstName & "!",
          "email": data.payload.Email
       }       
  }
`;

Как мне использовать javascript / JSONata?

Фон и ограничения:

  1. Дочерние выражения (выражения 1 и 2 в примере) (которые должны быть добавлены в родительское выражение) всегда будут простым присваиванием, как "a" : x.y.z or "b" : x.

  2. Дочерние выражения могутуже присутствовать в родительском выражении.В этом случае он заменяет присваивание.

  3. Также я хочу удалить некоторые пути json из родительского выражения (ofcouse, если оно присутствует), например If delete path data.Email.

Что я сделал?:

  • Я пытался преобразовать скрипт JSONata в JSON, поместив значения в двойные кавычки и кодировав значение с помощью функции escape ().
  • Получив JSON, я ищу путь, упомянутый в дочернем выражении (например, data.Email)

    • Если путь существует: замените его значение
    • Если путь не существует: создайте путь и присвойте значение
    • Если путь должен быть удален: просто удалите его.
  • Как только я закончил обработку вышеJSON, я преобразовываю его в сценарий JSONata, удаляя кавычки, используя набор регулярных выражений, а затем применяя метод unescape () для декодирования.

  • Проблема с этим подходом:

    • Это ненадежно (сопоставление и замена регулярных выражений не является полностью защищенным)
    • Я не уверен, можно ли всегда преобразовывать каждую JSONata (которая не объявляет какие-либо функции) в действительный JSON.
...