【问题标题】:Conditional Mapping Inbound XML to JSON将入站 XML 条件映射到 JSON
【发布时间】:2019-08-21 21:55:20
【问题描述】:

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

【问题讨论】:

    标签: dataweave


    【解决方案1】:

    我可以想出两种解决此案的方法。一种是使用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"
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-24
      • 2017-03-20
      • 1970-01-01
      • 2010-10-25
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多