从JSON转换时,如何在HCI中的XML元素的开头添加前缀?

2020-09-12 09:26发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


同事们,

我正在尝试将JSON请求(来自外部系统)转换为HCI中的XML(C4C)。 我正在使用groovy脚本。

我的输入json是:

 {
     " serviceCall":{
     " id":" 4021788",
     " statusCode":"-2"
 }
 } 

C4C中预期的输出xml是:

 
 
  TEST_INB_SER_CORE 
  2006-03-28T12:00:00.1234567Z 
 
  true 
 <发送方>
  AAAA 
 
 <收件人方>
  ZZZZ 
 
 
  3 
  106 
 
 
 
 
  SRQ_REQ_CONF_BMH 
 
 
  4021788 
  -2 
 
 
 
 

除了json中的两个值之外,我还必须对所有具有属性,值,名称空间和前缀的xml结构进行硬编码。

因此我要做的是

步骤1:我将接收到的json修改为上述xml格式,以便在步骤2-JSONtoXML转换器中可以直接将其转换并获取输出

代码:

导入com.sap.gateway.ip.core.customdev.util.Message;
 导入java.util.HashMap;
 导入java.lang.StringBuffer;
 导入groovy.json.JsonSlurper;
 导入groovy.json.JsonBuilder;
 导入groovy.json。*;

 def消息processData(消息消息){
    //身体
    //def body = message.getBody(java.lang.String)as String;
     字符串正文= message.getBody(String.class);
    
     def messageLog = messageLogFactory.getMessageLog(message);
     if(messageLog!= null){
         messageLog.setStringProperty(" Logging#1","将有效负载打印为附件");
         messageLog.addAttachmentAsString("从Postman-Coresystem传入的JSON:",正文," text/json");
        
      }
     
    //解析来自内核的传入json响应
     def jsonSlurper =新的JsonSlurper();
     def entryJson = jsonSlurper.parseText(body);
    //从incomingJson获取值
     字符串serviceCallID = entryJson.serviceCall.id;
     字符串statusCode = entryJson.serviceCall.statusCode;

    //将值设置为message属性
     message.setProperty(" id",serviceCallID);
     message.setProperty(" statusCode",statusCode);
    
    //使用c4c请求结构构建新的json
     def builder =新的JsonBuilder()
     builder.ServiceRequestReplicateConf {
         MessageHeader {
             ID(" MJTEST_CORE_TO_C4C")
             CreationDateTime('2018-07-07T12:00:00.1234567Z')
             TestDataIndicator('假')
             ReconciliationIndicator('true')
             SenderParty {
                 内部识别码{
                     '@schemeID'('CommunicationSystemID')
                     '@schemeAgencyID'('310')
                     '$ title'('AAAA')
                 }
             }
             接收方{
                 内部识别码{
                     '@schemeID'('CommunicationSystemID')
                     '@schemeAgencyID'('310')
                     '$ title'('ZZZZ')
                 }
             }
             业务范围 {
                 TypeCode('3')
                 ID('106')
             }
         }
         ServiceRequestReplicationConfirmationMessage {
             BasicMessageHeader {
                ID('SRQ_REQ_CONF')
             }
             ServiceRequestInstance {
                 '@actionCode'('02')
                 ID(serviceCallID)
 StatusText(状态代码)
             }
         }
     }
    字符串newjson = JsonOutput.prettyPrint(builder.toString());
     def messageLog2 = messageLogFactory.getMessageLog(message);
     if(messageLog!= null){
         messageLog.setStringProperty(" Logging#1","将有效负载打印为附件");
         messageLog.addAttachmentAsString("已重构的Json,具有完整的结构,如C4C:",newjson," text/json");
     }
     message.setBody(newjson);
     返回消息;
 }
 
修改后的输出Json
 {
     " ServiceRequestReplicateConf":{
         " MessageHeader":{
             " ID":" MJTEST_CORE_TO_C4C",
             " CreationDateTime":" 2018-07-07T12:00:00.1234567Z",
             " TestDataIndicator":" false",
             " ReconciliationIndicator":" true",
             " SenderParty":{
                 " InternalID":{
                     " @schemeID":" CommunicationSystemID",
                     " @schemeAgencyID":" 310",
                     " $ title":" AAAA"
                 }
             },
             " RecipientParty":{
                 " InternalID":{
                     " @schemeID":" CommunicationSystemID",
                     " @schemeAgencyID":" 310",
                     " $ title":" ZZZZ"
                 }
             },
             "业务范围": {
                 " TypeCode":" 3",
                 " ID":" 106"
             }
         },
         " ServiceRequestReplicationConfirmationMessage":{
             " BasicMessageHeader":{
                 " ID":" SRQ_REQ_CONF"
             },
             " ServiceRequestInstance":{
                 " @actionCode":" 02",
                 " ID":" 4021788",
                 " StatusText":"-2"
             }
         }
     }
 } 

第2步:使用Json Prefix(glob)和XML名称空间( http://sap.com/xi/SAPGlobal20/Global

第3步:通过SOAP适配器将XML发送到C4C

我得到的输出XML:

 <?xml version ='1.0'encoding ='UTF-8'?>
 
   
      MJTEST_CORE_TO_C4C 
      2018-07-07T12:00:00.1234567Z 
     
      true 
     <发送方>
        AAAA 
     
     <收件人方>
        ZZZZ 
     
     
        3 
        106 
     
   
   
     
        SRQ_REQ_CONF 
     
     
        4021788 
        -2 
     
   
 
 

我的要求是:

在以下标签中,我需要在标签的开头添加前缀" glob",如C4C中的Expected output xml所示。

 
 

您能帮我吗?

谢谢

玛丽

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


同事们,

我正在尝试将JSON请求(来自外部系统)转换为HCI中的XML(C4C)。 我正在使用groovy脚本。

我的输入json是:

 {
     " serviceCall":{
     " id":" 4021788",
     " statusCode":"-2"
 }
 } 

C4C中预期的输出xml是:

 
 
  TEST_INB_SER_CORE 
  2006-03-28T12:00:00.1234567Z 
 
  true 
 <发送方>
  AAAA 
 
 <收件人方>
  ZZZZ 
 
 
  3 
  106 
 
 
 
 
  SRQ_REQ_CONF_BMH 
 
 
  4021788 
  -2 
 
 
 
 

除了json中的两个值之外,我还必须对所有具有属性,值,名称空间和前缀的xml结构进行硬编码。

因此我要做的是

步骤1:我将接收到的json修改为上述xml格式,以便在步骤2-JSONtoXML转换器中可以直接将其转换并获取输出

代码:

导入com.sap.gateway.ip.core.customdev.util.Message;
 导入java.util.HashMap;
 导入java.lang.StringBuffer;
 导入groovy.json.JsonSlurper;
 导入groovy.json.JsonBuilder;
 导入groovy.json。*;

 def消息processData(消息消息){
    //身体
    //def body = message.getBody(java.lang.String)as String;
     字符串正文= message.getBody(String.class);
    
     def messageLog = messageLogFactory.getMessageLog(message);
     if(messageLog!= null){
         messageLog.setStringProperty(" Logging#1","将有效负载打印为附件");
         messageLog.addAttachmentAsString("从Postman-Coresystem传入的JSON:",正文," text/json");
        
      }
     
    //解析来自内核的传入json响应
     def jsonSlurper =新的JsonSlurper();
     def entryJson = jsonSlurper.parseText(body);
    //从incomingJson获取值
     字符串serviceCallID = entryJson.serviceCall.id;
     字符串statusCode = entryJson.serviceCall.statusCode;

    //将值设置为message属性
     message.setProperty(" id",serviceCallID);
     message.setProperty(" statusCode",statusCode);
    
    //使用c4c请求结构构建新的json
     def builder =新的JsonBuilder()
     builder.ServiceRequestReplicateConf {
         MessageHeader {
             ID(" MJTEST_CORE_TO_C4C")
             CreationDateTime('2018-07-07T12:00:00.1234567Z')
             TestDataIndicator('假')
             ReconciliationIndicator('true')
             SenderParty {
                 内部识别码{
                     '@schemeID'('CommunicationSystemID')
                     '@schemeAgencyID'('310')
                     '$ title'('AAAA')
                 }
             }
             接收方{
                 内部识别码{
                     '@schemeID'('CommunicationSystemID')
                     '@schemeAgencyID'('310')
                     '$ title'('ZZZZ')
                 }
             }
             业务范围 {
                 TypeCode('3')
                 ID('106')
             }
         }
         ServiceRequestReplicationConfirmationMessage {
             BasicMessageHeader {
                ID('SRQ_REQ_CONF')
             }
             ServiceRequestInstance {
                 '@actionCode'('02')
                 ID(serviceCallID)
 StatusText(状态代码)
             }
         }
     }
    字符串newjson = JsonOutput.prettyPrint(builder.toString());
     def messageLog2 = messageLogFactory.getMessageLog(message);
     if(messageLog!= null){
         messageLog.setStringProperty(" Logging#1","将有效负载打印为附件");
         messageLog.addAttachmentAsString("已重构的Json,具有完整的结构,如C4C:",newjson," text/json");
     }
     message.setBody(newjson);
     返回消息;
 }
 
修改后的输出Json
 {
     " ServiceRequestReplicateConf":{
         " MessageHeader":{
             " ID":" MJTEST_CORE_TO_C4C",
             " CreationDateTime":" 2018-07-07T12:00:00.1234567Z",
             " TestDataIndicator":" false",
             " ReconciliationIndicator":" true",
             " SenderParty":{
                 " InternalID":{
                     " @schemeID":" CommunicationSystemID",
                     " @schemeAgencyID":" 310",
                     " $ title":" AAAA"
                 }
             },
             " RecipientParty":{
                 " InternalID":{
                     " @schemeID":" CommunicationSystemID",
                     " @schemeAgencyID":" 310",
                     " $ title":" ZZZZ"
                 }
             },
             "业务范围": {
                 " TypeCode":" 3",
                 " ID":" 106"
             }
         },
         " ServiceRequestReplicationConfirmationMessage":{
             " BasicMessageHeader":{
                 " ID":" SRQ_REQ_CONF"
             },
             " ServiceRequestInstance":{
                 " @actionCode":" 02",
                 " ID":" 4021788",
                 " StatusText":"-2"
             }
         }
     }
 } 

第2步:使用Json Prefix(glob)和XML名称空间( http://sap.com/xi/SAPGlobal20/Global

第3步:通过SOAP适配器将XML发送到C4C

我得到的输出XML:

 <?xml version ='1.0'encoding ='UTF-8'?>
 
   
      MJTEST_CORE_TO_C4C 
      2018-07-07T12:00:00.1234567Z 
     
      true 
     <发送方>
        AAAA 
     
     <收件人方>
        ZZZZ 
     
     
        3 
        106 
     
   
   
     
        SRQ_REQ_CONF 
     
     
        4021788 
        -2 
     
   
 
 

我的要求是:

在以下标签中,我需要在标签的开头添加前缀" glob",如C4C中的Expected output xml所示。

 
 

您能帮我吗?

谢谢

玛丽

付费偷看设置
发送
1条回答
哎,真难
1楼-- · 2020-09-12 10:11

同事们,

我可以找到我想要的答案。

我通过在单引号中提供前缀和开始标记,对下面的Step1代码进行了修改:

 .............................................................  ....................................
 .... def builder =新的JsonBuilder()
       builder.'glob:ServiceRequestReplicateConf'{
               MessageHeader {......
 ...................................................  ....................................
 

这给了我所需的预期输出:

输出Json:

 ..................................................
 {
     " glob:ServiceRequestReplicateConf":{
         " MessageHeader":{
 ......................................... 

输出带有前缀glob的XML:

 ..............

 
 ................ 

P.S:为什么我尝试采用的方法是,对于Sender,他们没有XSD或可以映射到C4C入站服务结构的常规结构。 因此尝试了这种方式。

我面临的挑战:

当我尝试从Google获得的答案时,JSONtoXML转换器或groovy脚本不支持。 另外,我在Cloud Platform Integration( help.sap.com )文档中找不到 在我的情况下应支持的任何示例或语法。 我基本上不愿意添加JSON前缀(在我的示例中为 eg:glob),名称空间( eg: xmlns:glob =" http://sap.com/xi/SAPGlobal20/Global ")和 也带有具有属性和值的JSON元素( InternalID {'@schemeID'('CommunicationSystemID')'@ schemeAgencyID'('310')'$ title'('AAAA') }。在这里,要表示属性,我们必须使用前缀" @",对于值,我们必须使用前缀" $"。

希望这对尝试使用Groovy脚本中的JSON到XML转换器将传入JSON转换为传出XML的同事有所帮助。

感谢与问候,

玛丽·何塞

一周热门 更多>