使用Dataweave,我试图将入站XML
负载映射到基于标记值的条件映射到JSON
。例如,如果FieldValue.FieldName == “DueDate”
,则将相同父FieldValue.Value
标记下的FieldValue
值映射到customfield_10659
,如果将FieldValue.FieldName == “CommittedDate”
映射到customfield_19029
。同样,如果值为FieldValue.FieldName == "Importance"
,则将值FieldValue.Value.Id.Value
映射到customfield_38383
==============
输入XML:
<OutboundRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xyz.bac/api">
<Entities>
<BaseEntity i:type="GenericEntity">
<Id>
<TypeName>Project</TypeName>
<Value>76wp5wtggqnr2zh2zulelom6v92</Value>
</Id>
<Values>
<FieldValue>
<FieldName>DueDate</FieldName>
<Value xmlns:d6p1="http://www.w3.org/2001/XMLSchema" i:type="d6p1:dateTime">2019-07-30T21:00:00</Value>
</FieldValue>
<FieldValue>
<FieldName>StartDate</FieldName>
<Value xmlns:d6p1="http://www.w3.org/2001/XMLSchema" i:type="d6p1:dateTime">2019-03-04T13:00:00</Value>
</FieldValue>
<FieldValue>
<FieldName>CommittedDate</FieldName>
<Value xmlns:d6p1="http://www.w3.org/2001/XMLSchema" i:type="d6p1:dateTime">2019-01-31T00:00:00</Value>
</FieldValue>
<FieldValue>
<FieldName>C_Components</FieldName>
<Value i:type="EntityId">
<TypeName>C_WorkItemComponents</TypeName>
<Value>SS-BA;SS-PM;IS-JIRA</Value>
</Value>
</FieldValue>
<FieldValue>
<FieldName>C_PrimaryTeam</FieldName>
<Value i:type="GenericEntity">
<Id>
<TypeName>C_WorkItemPrimaryTeam</TypeName>
<Value>IS-JIRA</Value>
</Id>
<Values />
</Value>
</FieldValue>
<FieldValue>
<FieldName>Importance</FieldName>
<Value i:type="GenericEntity">
<Id>
<TypeName>Importance</TypeName>
<Value>High</Value>
</Id>
<Values />
</Value>
</FieldValue>
<FieldValue>
<FieldName>C_JIRA_Integration_Code</FieldName>
<Value xmlns:d6p1="http://www.w3.org/2001/XMLSchema" i:type="d6p1:string">ZenJIRA</Value>
</FieldValue>
<FieldValue>
<FieldName>C_JIRAKey</FieldName>
<Value xmlns:d6p1="http://www.w3.org/2001/XMLSchema" i:type="d6p1:string">https://dev.server/browse/ABC-14759</Value>
</FieldValue>
<FieldValue>
<FieldName>Phase</FieldName>
<Value i:type="GenericEntity">
<Id>
<TypeName>Phase</TypeName>
<Value>Coordination</Value>
</Id>
<Values />
</Value>
</FieldValue>
</Values>
</BaseEntity>
</Entities>
<OrganizationId>2heyug4hn27vwlvmm3t6o92x90</OrganizationId>
<RuleName>JiraSync</RuleName>
</OutboundRequest>
输出JSON:
{
"fields": {
"customfield_10659": "2019-07-30T21:00:00",
"customfield_19029": "2019-07-30T21:00:00",
"customfield_10645": {
"value": "High"
},
"customfield_12925": {
"value": "IS-JIRA"
},
"customfield_12735": {
"value": "BlockerReason"
}
}
}
答案 0 :(得分:2)
我可以想到两种解决这种情况的方法。一个正在使用conditional key value pairs,在这种情况下,您要一一对应。
%dw 2.0
output application/json
---
{
"fields": {
(payload.OutboundRequest.Entities.BaseEntity.Values.*FieldValue map ((item, index) -> {
("customfield_10659": item.Value) if(item.FieldName == "DueDate"),
("customfield_19029": item.Value) if(item.FieldName == "CommittedDate"),
("customfield_38383": item.Value.Id.Value) if(item.FieldName == "Importance"),
})),
"customfield_12925": {
"value": "IS-JIRA"
},
"customfield_12735": {
"value": "BlockerReason"
}
}
}
其他解决方案是使用dynamic keys和一个查找对象。这种方式代码更少,但动态性更高
%dw 2.0
output application/json
var lookup = {
DueDate: "customfield_10659",
CommittedDate: "customfield_19029",
Importance: "customfield_38383"
}
---
{
"fields": {
(payload.OutboundRequest.Entities.BaseEntity.Values.*FieldValue map ((item, index) -> {
((lookup[item.FieldName]): item.Value match {
case is String -> $
case is Object -> $.Id.Value
}) if(lookup[item.FieldName]?),
})),
"customfield_12925": {
"value": "IS-JIRA"
},
"customfield_12735": {
"value": "BlockerReason"
}
}
}