Я конвертирую данные JSON во вложенные JSON, используя процессор JoltTransformation
в Apache Nifi
.
Это ввод JSON, который необходимо преобразовать во вложенный формат.
[
{
"Agent": "A1",
"Location": "L1",
"Company": "Hyundai",
"Model1": "Verna",
"Sub-Model1": "2018"
},
{
"Agent": "A1",
"Location": "L1",
"Company": "Hyundai",
"Model1": "Creta",
"Sub-Model1": "2015"
},
{
"Agent": "A1",
"Location": "L1",
"Company": "Hyundai",
"Model1": "Aura",
"Sub-Model1": "2022"
},
{
"Agent": "A2",
"Location": "L1",
"Company": "Toyota",
"Model1": "Fortuner",
"Sub-Model1": "2020"
}
]
Вложенный вывод JSON, который я хочу получить от JOLT Spec. Я группирую данные по комбинированным ключам Company
, Model1
и Sub-Model1
. И, наконец, вам нужны такие вложенные данные JSON. Я попытался найти документацию Jolt Spec.
[
{
"Agent": "A1",
"loc_id": "L1",
"Company": {
"Hyundai": [
{
"Verna": [
{
"2018": []
}
]
},
{
"Creta": [
{
"2015": []
}
]
},
{
"Aura": [
{
"2022": []
}
]
}
]
}
},
{
"Agent": "A2",
"loc_id": "L1",
"Company": {
"Toyota": [
{
"Fortuner": [
{
"2020": []
}
]
}
]
}
}
]
Я пробовал это до сих пор, но он не дает желаемого результата.
[
{
"operation": "shift",
"spec": {
"*": {
"*": "@(1,Agent)@(1,location)@(1,Company)@(1,Model1)@(1,Sub-Model1).&"
}
}
},
{
"operation": "shift",
"spec": {
"*": {
"$": "agent.[#2].Agent",
"*": {
"$": "agent.[#3].location",
"*": {
"*": {
"$": "agent.[#4].Company",
"*": {
"Model1*": "agent.[#6].Company.[#4].Sub-MOdel1.[#2].&"
}
}
}
}
}
}
}
]
Вы можете использовать эту спецификацию:
[
{
"operation": "shift",
"spec": {
"*": {
"@(0,Agent)": "@(1,Agent).Agent",
"@(0,Location)": "@(1,Agent).loc_id",
"Sub-Model1": "@(1,Agent).Company.@(1,Company).@(1,Model1).@(1,Sub-Model1)"
}
}
},
{
"operation": "cardinality",
"spec": {
"*": { // A1, A2
"loc_id": "ONE",
"Agent": "ONE"
}
}
},
{
"operation": "shift",
"spec": {
"*": { // A1, A2
"*": "[#2].&",
"Company": {
"*": { // Hyundai
"*": { // Verna
"*": { // 2018
"@": "[#6].&4.&3[#3].&2.[#1].&"
}
}
}
}
}
}
},
{
"operation": "modify-overwrite-beta",
"spec": {
"*": {
"*": {
"*": {
"*": {
"*": {
"*": {
"*": []
}
}
}
}
}
}
}
}
]
Первая операция: shift
Мы должны добавить все элементы в соответствии со значением Agent
, чтобы они были в одном массиве, и мы будем использовать индекс массива в будущем.
Вторая операция: cardinality
У нас есть несколько массивов, которые имеют несколько одинаковых значений из-за результата предыдущей операции. Мы можем изменить их на нормальные значения с помощью операции cardinality
и ONE
, чтобы сделать их одним значением вместо массива значений.
Третья операция: shift
Принесите значения Model1
и Sub-Model1
в массив.
Четвертая операция: modify-overwrite-beta
Присвойте значение пустого массива []
значениям Sub-Model1
.
@Destiel Описание добавлено для всех шагов. Я настоятельно рекомендую вам, шаг за шагом запускать спецификации и смотреть, что именно получилось. Удачи.
Я хочу подробно разобраться в этой строке ""Sub-Model1": "@(1,Agent).Company.@(1,Company).@(1,Model1).@(1,Sub-Model1)" " Как здесь работает эта (.) точка?
@Destiel Dot .
известен JOLT. Вы можете сказать создать объект со значением @(1,Agent)
, а затем создать объект с ключом Company
и...
Привет, вы знаете, как я могу вызвать условный цикл на invokeHTTP? Я должен вызывать API в NIFI, пока его условие не станет истинным. Например: я вызываю API с идентификатором и получаю SUB-ID в результате API, теперь этот SubId будет идентификатором для следующего вызова и будет продолжать вызывать API, пока мы не получим пустое значение.
@Destiel Насколько я знаю об этом, вы можете использовать процессор UpdateAttribute и получить ID
в качестве переменной в вашем потоковом файле, а затем использовать его в другом InvokeHttp (второй процессор, а не первый), а затем создать цикл, добавив условие с RouteOnAttribute и установите свое условие (пока ваш ID
не будет пустым с nifi expression language
).
Привет, у меня есть еще один случай для спецификации толчка, когда Model1 или subModel1 (оба или один) будут пустыми, данные для этих строк не печатаются, я хочу распечатать данные, даже если столбец модели или подмодели пуст. Я приложил новый блок кода для того же самого.
Уважаемый @Destiel, пожалуйста, задайте другой ответ на новый вопрос, который у вас есть. Общаться в комментариях к посту нехорошо. Пожалуйста, откатите свой ответ к последним вещам, с которыми ответ совпал. Я всегда буду рядом, если у вас возникнут вопросы в теге JOLT :)
Я задаю другой вопрос. Приносим извинения за неудобства
Спасибо, это сработало, но я хотел бы знать, можете ли вы добавить описание, чтобы я мог лучше его понять, а также, где изменить, если я хочу добавить больше списка в SUB-MODEL1, например, что-то вложенное в sub-model2[].