Проверка Null при встряске при преобразовании строки в целое число Для объекта

#java #jolt

Вопрос:

Я выполняю преобразование строки в целое число/двойное в своей спецификации jolt. Если элементы не поступают в запросе, то в ответ приходит пустой объект. Вместо этого я не хочу передавать сам этот объект как пустой.

Работа с Запросом На Ввод:

 {
  "data": {
    "first": "1",
    "second": "2"
  }
}
 

Спецификация толчка:

 [
  {
    "operation": "shift",
    "spec": {
      "data": {
        "first": "datas.firstTag",
        "second": "datas.second.secondTag"
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "datas": {
        "firstTag": "=toInteger",
        "second": {
          "secondTag": "=toInteger"
        }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": "=recursivelySquashNulls"
    }
  }
]
 

Вывод, если тег есть в запросе:

 {
  "datas" : {
    "firstTag" : 1,
    "second" : {
      "secondTag" : 2
    }
  }
}
 

Но когда запрос на ввод, как показано ниже, где я не получаю второй тег:

 {
  "data": {
    "first": "1"
  }
}
 

Выходной ток:

 {
  "datas" : {
    "firstTag" : 1,
    "second" : { }
  }
}
 

Получение второго объекта как пустого

 "second" : { }
 

Ожидаемый Результат:

 {
  "datas" : {
    "firstTag" : 1
  }
}
 

Пожалуйста, помогите устранить эту проблему.

Ответ №1:

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

 [
  {
    "operation": "shift",
    "spec": {
      "*": { 
        "first": "amp;1s.amp;Tag",
        "*": { "@(1,amp;)": "amp;2s.amp;.amp;Tag" }
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": {
        "firstTag": "=toInteger",
        "*": {
          "*": "=toInteger"
        }
      }
    }
  }
]
 

целые числа с суффиксами для этих амперсандов представляют уровень, на который нужно подняться, чтобы получить желаемое значение, например, amp;1 и amp;2 означают данные, amp; без целых суффиксов представляют значение текущего уровня.

Подстановочный знак «*» представляет остальные элементы, кроме первого в этом случае(у вас может быть третий, четвертый … как и другие элементы, которые будут отформатированы, как второй)

первый случай : введите описание изображения здесь

второй случай : введите описание изображения здесь

Изменить : Для текущего случая, который упоминается в правке, чтобы получить

 {
  "datas" : {
    "firstTag" : "1",
    "second" : {
      "secondTag" : "2",
      "secondNew" : "3"
    }
  }
}
 

из входных данных

 {
  "data": {
    "first": "1",
    "second": "2",
    "secondNew": "3"
  }
}
 

в котором была новая запись «secondNew»: «3», вам нужно будет явно записать каждый ключ в спецификации, например

 [
  {
    "operation": "shift",
    "spec": {
      "*": {
        "first": "amp;1s.amp;Tag",
        "second": "amp;1s.amp;.amp;Tag",
        "secondNew": "amp;1s.second.amp;"
      }
    }
  },
  {
    "operation": "modify-overwrite-beta",
    "spec": {
      "*": {
        "firstTag": "=toInteger",
        "*": {
          "*": "=toInteger"
        }
      }
    }
  }
]
 

для того, чтобы объединить остальные элементы под общим объектом.

Комментарии:

1. Ожан спасибо за быстрое решение. Есть ли у нас какой-либо другой способ сделать это без динамической манеры? Потому что на самом деле у меня есть еще несколько тегов, которые должны быть только во втором объекте. Но если я добавлю в запрос какие-либо новые теги, которые должны появиться во втором объекте, вместо этого он фактически появится как новый объект. { «данные»: { «первый»: «1», «второй»: «2», «Второй»: «3» } } но необходимы как { «данные» : { «Первый»: 1, «второй» : { «Второй» : 2, «Второй» : 3 } } }

2. Привет @Chethan , не за что. Я отредактировал ответ в связи с вашей потребностью.

3. Спасибо @Barbaros Ozhan. Основываясь на вашем ответе,я могу изменить свой ответ.