英文:
Looping through multiple line items in a single array output in JOLT
问题
{
"data": {
"filename": "EV10044.docx"
}
}
英文:
I want to write a Jolt definition that loops through each object in my attachment array, and move the object to the data array. At the same time, it should map single object attachment nest, and move the object to the data object.
Currently my spec below is working when my attachment block is an array.
Input :
{
"IntegrationEntities": {
"integrationEntity": [
{
"integrationEntityHeader": {
"attachments": {
"attachment": [
{
"name": "EV10044.docx"
},
{
"name": "Test1.txt"
}
]
}
}
}
]
}
}
JOLT Spec :
[
{
"operation": "shift",
"spec": {
"IntegrationEntities": {
"integrationEntity": {
"*": {
"integrationEntityHeader": {
"attachments": {
"attachment": {
"*": {
"name": "data[&1].filename"
}
}
}
}
}
}
}
}
}
]
Current Output :
{
"data": [
{
"filename": "EV10044.docx"
},
{
"filename": "Test1.txt"
}
]
}
I want to handle the scenario in a way where regardless if the attachment is an array or object it should give the input. Currently it fails if the attachment block is an object and gives the output as NULL.
IF Input is:
{
"IntegrationEntities": {
"integrationEntity": [
{
"integrationEntityHeader": {
"attachments": {
"attachment": {
"name": "EV10044.docx"
}
}
}
}
]
}
}
Desired Output:
{
"data": {
"filename": "EV10044.docx"
}
}
答案1
得分: 1
你可以使用这个规范:
[
{
"operation": "shift",
"spec": {
"IntegrationEntities": {
"integrationEntity": {
"*": {
"integrationEntityHeader": {
"attachments": {
"attachment": {
"name": "data.filename",
"*": {
"name": "data[&1].filename"
}
}
}
}
}
}
}
}
}
]
我刚刚在你的规范中添加了以下行。所以如果在attachment
中有name
,则假定你有1个附件。如果找不到name
,则假定你有一个数组,你的其他代码是正确的。
"name": "data.filename"
英文:
You can use this spec:
[
{
"operation": "shift",
"spec": {
"IntegrationEntities": {
"integrationEntity": {
"*": {
"integrationEntityHeader": {
"attachments": {
"attachment": {
"name": "data.filename",
"*": {
"name": "data[&1].filename"
}
}
}
}
}
}
}
}
}
]
I just added the below line to your spec. So if you have name
in the attachment
it is assumed that you have 1 attachment. If no name
is found it is assumed you have an array and your other codes is correct.
"name": "data.filename",
答案2
得分: 1
一个选项是使用shift转换规范,其中对象通过路径表达式进行限定,数组与符号表达式**"*": {
**一起构建,包括子索引,例如:
[
{
"operation": "shift",
"spec": {
"@IntegrationEntities.integrationEntity": {
"*": {
"@integrationEntityHeader.attachments.attachment": {
"*": {
"*": "data[].file&",
"@1,name": "data.file&"
}
}
}
}
}
}
]
顺便说一下,如果您不需要将最内层的属性**name
重命名为fieldname
**,以下更简短的规范就足够了:
[
{
"operation": "shift",
"spec": {
"@IntegrationEntities.integrationEntity": {
"*": {
"@integrationEntityHeader.attachments.attachment": "data"
}
}
}
}
]
英文:
An option is to use a shift transformation spec in which the objects are qualified by path expressions and the arrays are constructed along with sub-indexes by symbolic expression "*": {
such as
[
{
"operation": "shift",
"spec": {
"@IntegrationEntities.integrationEntity": {
"*": { // indexes of the array
"@integrationEntityHeader.attachments.attachment": {
"*": { // indexes of the array
"*": "data[].file&", // if "attachment" is an array
"@1,name": "data.file&" // if "attachment" is an object
}
}
}
}
}
}
]
Btw, if you didn't need to rename the innermost attribute name
to fieldname
, the following shorter spec would suffice :
[
{
"operation": "shift",
"spec": {
"@IntegrationEntities.integrationEntity": {
"*": {
"@integrationEntityHeader.attachments.attachment": "data"
}
}
}
}
]
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论