Создание одного JSON из комбинированного списка JSON - PullRequest
0 голосов
/ 05 декабря 2018

Я получаю несколько файлов json в цикле for, и каждый json в каждом цикле имеет формат:

{
    "myproperties": {
        "http.port": "8088",
        "http.base": "/abc",
        "http.path": "test"
    },
    "information": [{
        "abc": {
            "key1": "ghghghghgh"
        },
        "efg": {
            "key1": "value1"
        }
    }]
}

и

{
    "myproperties": {
        "http.port": "6789",
        "db.base": "tat",
        "db.path": "ghghghg"
    },
    "information": [{
        "efg": {
            "key1": "ghghghghgh"
        },
        "ijk": {
            "key1": "value1"
        }
    }]
}

и т. Д. ……….

Я управляю до объединяем все json в списке вне цикла for, и список json объединения выглядит следующим образом:

    [{
    "myproperties": {
        "http.port": "8088",
        "http.base": "/abc",
        "http.path": "test"
    },
    "information": [{
        "abc": {
            "key1": "ghghghghgh"
        },
        "efg": {
            "key1": "value1"
        }
    }]
}, 
 {
    "myproperties": {
        "http.port": "6789",
        "db.base": "tat",
        "db.path": "ghghghg"
    },
    "information": [{
        "efg": {
            "key1": "ghghghghgh"
        },
        "ijk": {
            "key1": "value1"
        }
    }]
}]

Теперь я хочу сделать **single** json вывод из этого комбината json в следующем формате:

 {
    "myproperties": {
        "http.port": "6789",
        "db.base": "tat",
        "db.path": "ghghghg",
        "http.base": "/abc",
        "http.path": "test"
    },
    "information": [{
            "efg": {
                "key1": "ghghghghgh"
            },
            "ijk": {
                "key1": "value1"
            }
        },
        {
            "abc": {
                "key1": "ghghghghgh"
            },
            "efg": {
                "key1": "value1"
            }
        }
    ]
 }

обратите внимание, только в разделе myproperties уникальный и отдельный узел есть.Я не уверен, как начать это с dataweave ... любой указатель будет оценен,

Я пробовал следующее:

%dw 1.0
%output application/json skipNullOn="everywhere",encoding="UTF-8"
---
payload map {

    myproperties: $.myproperties,
    information: $.information

}

Но не работает

Спасибо

1 Ответ

0 голосов
/ 05 декабря 2018

Попробуйте mapObject для объединения свойств и выравнивания для изменения информационного массива в один массив, например

%dw 1.0
%output application/json
---
{
    myproperties : payload.myproperties mapObject $ ,
    information : (flatten payload.information) 
}

HTH

Обновление: - Для отдельных свойств вы должны сначала получить разные свойства, а затем отобразитьвсе отличные свойства.Но вы можете потерять дублирующиеся свойства.см. ниже

%dw 1.0
%output application/json
%var distinctProperties =((payload.myproperties mapObject $) pluck $$)  distinctBy $ 
%var aggregatedPropertiesMap =  (payload.myproperties mapObject $)
---
{
    myproperties : {( distinctProperties map { // interate over distinct properties 
        ($) : aggregatedPropertiesMap[$]    // map property as key and fetch its value from aggregatedPropertiesMap
    })} ,
    information : (flatten payload.information) 
}
...