JoltTransformJson — Преобразование Json

у меня есть значение JSON, как показано ниже:

{
  "table": "table_name",
  "op_type": "U",
  "before": {
    "AAAA": "1-1111",
    "BBBB": "2022-08-31 03:57:01",
    "CCCC": "2023-08-31 23:59:59"
  },
  "after": {
    "AAAA": "1-1112",
    "BBBB": "2022-08-31 10:10:34"
  }
}

я хочу сделать это как я могу сделать?

{ 
  "AAAA": "1-1112",
  "BBBB": "2022-08-31 10:10:34",
  "CCCC": "2023-08-31 23:59:59" 
  "changed_columns": "AAAA, BBBB"
}

AAAA: «Если у вас после.AAAA, возьмите AAAA еще до.AAAA», BBBB: «Если у вас после.BBBB, возьмите BBBB еще до.BBBB.

И я хочу добавить поле change_columns следующим образом:

,"changed_columns": "AAAA, BBBB"

Есть ли способ сделать это?

Что делать, если в обоих объектах есть атрибут CCCC?

Barbaros Özhan 14.11.2022 19:42

если оба объекта имеют CCCC, то следует взять CCCC или after.CCCC

veganzombie 14.11.2022 19:43
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
2
96
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать

  • спецификация кардинальности недавно после использования "after|before" в качестве ключа в этом порядке для определения приоритета
  • последовательно дважды обменяйтесь парами ключ-значение, чтобы определить, действительно изменили компоненты, чтобы сформировать "changed_columns"

Такие как

[
  {
    // multiplex the attributes in order to generate three independent groups
    "operation": "shift",
    "spec": {
      "after|before": { // this order is important to determine the precedence in the upcoming cardinality spec
        "*": { 
          "@": "&",
          "@(0)": "l.&",
          "*": {
            "@1": "f.&2"
          }
        }
      }
    }
  },
  {
    // determine whether before vs. after values equal through this and next two specs
    "operation": "modify-overwrite-beta",
    "spec": {
      "l": {
        "*": "=lastElement(@(1,&))"
      },
      "f": {
        "*": "=firstElement(@(1,&))"
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": "&",
      "l|f": {
        "*": {
          "$": "lf.@(0)"
        }
      }
    }
  },
  {
    "operation": "shift",
    "spec": {
      "*": "&",
      "lf": {
        "*": {
          "$": "&2.@(0)"
        }
      }
    }
  },
  {
    // construct an array from those newly formed keys
    "operation": "shift",
    "spec": {
      "*": "&",
      "lf": {
        "*": {
          "$": "changed_columns"
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "changed_columns": "=join(', ',@(1,&))"
    }
  },
  {
    "operation": "cardinality",
    "spec": {
      "*": "ONE"
    }
  },
  {
    "operation": "sort"
  }
]

Большое спасибо, Барбарос Аби :)

veganzombie 17.11.2022 20:53

Добро пожаловать @veganzombie . Есть несколько хороших ссылок о Jolt, таких как 1 , 2 , 3 , 4 , 5. Удачной учебы.

Barbaros Özhan 17.11.2022 20:59
Ответ принят как подходящий

Вы можете использовать операцию shift и получить значения after для первого. а затем вы можете использовать значения before. Итак, если ключи совпадают вместе, у вас есть массив с двумя элементами.

Теперь вы можете получить первый элемент для получения значений after с помощью операций modify-overwrite-beta и функции =firstElement.

[
  {
    "operation": "shift",
    "spec": {
      "after": {
        "*": {
          "$": "changed_columns[]",
          "@(1,&)": "&1"
        }
      },
      "before": {
        "*": "&"
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": "=firstElement(@(1,&))",
      "changed_columns": "=join(', ',@(1,changed_columns))"
    }
  }
]

в этой структуре, Как я могу сравнить настраиваемые поля, а не все поля? пример: включая AAAA и BBBB, не включая CCCC. В поле change_columns могут быть столбцы, которые мне не нужны.

veganzombie 26.11.2022 21:57

@veganzombie Вы можете удалить его перед сменой с помощью этой спецификации: { "operation": "remove", "spec": { "before": { "CCCC": "" } } }

MohammadReza 27.11.2022 04:59

Другие вопросы по теме