如何在PI映射中读取JSON有效负载#PI REST适配器#

2020-08-21 09:42发布

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

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


大家好,

我在这种情况下:

PI正在REST发送方CC中接收HTTP请求。

我需要将源文件放在正确的目标字段中,同时将整个json有效负载字符串放入目标字段" json_string"中。

我尝试了很多方法,但是都失败了,有人能给我一个线索吗?

(13.8 kB)

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

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


大家好,

我在这种情况下:

PI正在REST发送方CC中接收HTTP请求。

我需要将源文件放在正确的目标字段中,同时将整个json有效负载字符串放入目标字段" json_string"中。

我尝试了很多方法,但是都失败了,有人能给我一个线索吗?

(13.8 kB)
付费偷看设置
发送
14条回答
Haoba3210
1楼-- · 2020-08-21 10:24

您好!

也许是,我不明白这个主意,但看起来要求是存储原始JSON内容,而不是REST适配器的JSON-XML +自定义映射XML的结果 -JSON转换。

我只需使用Java映射即可获取源JSON(无需在适配器级别将其转换为XML),将其保存为字符串,使用适当的库获取XML结构并构建目标XML文档(包括

关于此,Evgeniy。

Baoming ROSE
2楼-- · 2020-08-21 10:03

嗨,陈晓东

只是要进行迭代,您需要在json字符串中提供json负载。 我说的对吗?

如果是这样,则可以使用"用户定义函数"将请求xml转换为json,然后映射到字段" json_string"。

感谢与问候-Rajesh PS

当学会了学习
3楼-- · 2020-08-21 10:22

您好,小东!

这是一个示例Java映射类,可从输入JSON有效负载中生成XML输出:

< pre> import java.io.ByteArrayOutputStream; 导入java.io.IOException; 导入java.io.InputStream; 导入java.io.OutputStream; 导入org.json.JSONObject; 导入org.json.XML; 导入com.sap.aii.mapping.api.AbstractTransformation; 导入com.sap.aii.mapping.api.StreamTransformationException; 导入com.sap.aii.mapping.api.TransformationInput; 导入com.sap.aii.mapping.api.TransformationOutput; 公共类GenericJSONToXMLConverter扩展AbstractTransformation { 受保护的字符串messageTypeName; 受保护的String messageTypeNamespace; 公共无效的transform(TransformationInput输入,TransformationOutput输出)抛出StreamTransformationException { 尝试{ messageTypeName = in.getInputParameters()。getString(" MessageType")。trim(); } catch(例外e){ 抛出新的StreamTransformationException("找不到参数'MessageType':" + e.getMessage()); } 尝试{ messageTypeNamespace = in.getInputParameters()。getString(" MessageTypeNS")。trim(); } catch(例外e){ 抛出新的StreamTransformationException("找不到参数'MessageTypeNS':" + e.getMessage()); } executeMapping(in.getInputPayload()。getInputStream(),out.getOutputPayload()。getOutputStream()); } public void executeMapping(InputStream is,OutputStream os)引发StreamTransformationException { 尝试{ 如果(messageTypeName.isEmpty()) 抛出新的StreamTransformationException(" MessageType'的参数值不能为空"); 如果(messageTypeNamespace.isEmpty()) 抛出新的StreamTransformationException(" MessageTypeNS'的参数值不能为空"); 字符串有效负载字符串=新的字符串(getByteArrayFromInputStream(is)," UTF-8"); JSONObject json =新的JSONObject(payloadString); 字符串msgHeader =" "; 字符串msgFooter =" "; 字符串有效负载XML = msgHeader + XML.toString(json)+ msgFooter; os.write(payloadXML.getBytes(" UTF-8")); } catch(例外e){ 抛出新的StreamTransformationException(e.getMessage()); } } 私有字节[] getByteArrayFromInputStream(InputStream is)引发IOException { ByteArrayOutputStream缓冲区= new ByteArrayOutputStream(); int nRead; 字节[]数据=新字节[16384]; 而((nRead = is.read(data,0,data.length))!= -1) buffer.write(data,0,nRead); buffer.flush(); is.close(); 返回buffer.toByteArray(); }}

Evgeniy。

软件心理学工程师
4楼-- · 2020-08-21 10:25

嗨,Eygniy。

是的,完全正确,我需要原始JSON内容,而不是REST适配器的JSON-XML +自定义映射XML-JSON转换的结果。

我认为您的想法会奏效,但我不知道如何像您所说的那样建立ESR。 我设置CC时没有将JSON转换为XML,但是我不知道如何在映射中接收内容。

我创建了如下的消息类型和映射,对吗? json内容在哪里? 在"数据"字段中?

因为我不知道如何编写Java映射,所以我已经使用PI消息映射作为波纹管进行了测试,

但获得异常:com.sap.aii.adapter.xi.routing.RoutingException:无法解析XML消息有效负载以提取用于确定接收方的操作。org.xml.sax.SAXParseException; lineNumber:1; columnNumber:1; 序言中不允许内容。

我将其理解为:消息类型MT_JSON_STRING_IN无法接收json内容。

我是对的吗? 那我该怎么办?

渐行渐远_HoldOn
5楼-- · 2020-08-21 10:05

嗨,夏,

您可以为此使用json库。 只需导入罐子,然后仅输入一行代码即可。

https://mvnrepository.com/artifact/org.json/json

String xml_data =" abc ab "; //将xml转换为json JSONObject obj = XML.toJSONObject(xml_data); System.out.println(obj.toString()); 感谢和问候-Rajesh PS
闻人可可
6楼-- · 2020-08-21 10:07

谢谢! Evgeniy

我对读取传入的JSON有效负载具有类似的要求,并且能够使用上述代码作为参考来实现它。

一周热门 更多>