#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. Основываясь на вашем ответе,я могу изменить свой ответ.