条件映射入站XML到JSON

时间:2019-08-21 09:59:49

标签: dataweave

使用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"
        }
    }
}

1 个答案:

答案 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"
        }
    }
}