条件映射入站 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"
        }
    }
}