条件映射入站 XML 到 JSON
Conditional Mapping Inbound XML to JSON
使用 Dataweave,我尝试映射入站 XML
有效负载以根据标记值有条件地映射到 JSON
。例如,如果 FieldValue.FieldName == “DueDate”
则将同一父 FieldValue
标签下的 FieldValue.Value
的值映射到 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"
}
}
}
我能想到两种方法来解决这个问题。一种是使用 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"
}
}
}
使用 Dataweave,我尝试映射入站 XML
有效负载以根据标记值有条件地映射到 JSON
。例如,如果 FieldValue.FieldName == “DueDate”
则将同一父 FieldValue
标签下的 FieldValue.Value
的值映射到 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"
}
}
}
我能想到两种方法来解决这个问题。一种是使用 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"
}
}
}