REST Adapter实现SAP PI中的增强XML/JSON格式转换
SAP标准的REST adapter有着XML/JSON转换的功能,它很有用,因为一方面SAP PI/PO内部以XML格式处理数据,而另一方面,在处理REST架构风格的时候,JSON才是事实上的格式。
然而,观察下网上有关REST Adapter的相关问题,可以得出一个结论:XML消息处理后生成的JSON输出并非总是正确的,有时候它会把人引入歧途。SAP积极地增强了REST Adapter的各方面功能——定制化和特性丰富的JSON处理就是其中一个重点领域。许多这样的特性已经在记录在SAP Help的文档中。但是其中的一项相当强大、灵活的功能——名为“增强XML/JSON转换”的功能,却只是简单地在SAP Note 2175218中提及。在本文中,我将阐述这个功能的用法,以及提供有效参数化方法的细节。
在内部,REST adapter使用了第三方的Jettison以实现JSON处理。在标准配置中,REST adapter依赖于Jettison处理器默认的转换逻辑,它不会考虑或关联相应的消息类型中定义的有效元素属性,而是有自己的优化和类型机制,该机制基于所要处理的XML文档的元素的值的本来性质,而非消息的XSD schema。这样一来的结果是,有时转换会导致不合需求的输出。以下是两个通常的例子:
- 如果一个XML元素定义为数组,但是在被转换的XML有效数据中只包含一行,Jettison处理器将可能会将其转换为非数组类型。
- 如果一个XML元素定义为字符串,但是在被转换的XML有效数据中只有数字型的值,Jettison处理器将可能会将其转换为整数类型。
在某些情况下,不合适的类型转换对程序而言是不可接受的——这也是增强XML/JSON转换可以帮助我们解决的问题。
SAP Note 2175218介绍了增强XML/JSON转换背后的一个想法,它是有关JSON处理器如何对待特别的XML元素的明确的描述。让我们基于一个练习例子来测验这个功能:
下面是一个消息类型的定义,它用于同步场景的返回消息,我们在其中使用了REST sender channel。如你所见,它包含了多种类型的元素,包含一个数组:

XML格式的示例回复消息是这样的:

使用REST sender channel的标准配置,将上面的XML消息格式化后的JSON相应消息是这样的:

可以注意到,某些元素类型被错误的解释了,比如:
- 元素“ID”没有被视为字符串,而是数字——Jettison处理器将它作为数字对待,因为元素的值只包含数字类型的字符;
- 元素“Properties”没有被视为数组,Jettison处理器将它作为嵌套结构中的非数组对象,因为这恶搞元素只包含“Property”的一个子实体(没有其它兄弟元素)。
让我们通过增强XML/JSON转换来修复它。在REST sender channel中,增强XML/JSON转换的参数化信息存储在表 “Custom XML/JSON Conversion Rules”中。下面是针对之前高亮的有问题的类型和转换不匹配的配置。

在再次执行接口后,检查被格式化为JSON的响应消息,可以观察到,现在产生了正确的JSON输出:

我在官方材料中没有看到有关于参数化的细节,所以让我来总结下增强XML/JSON转换中可以使用的可接受的和有效值,以及有关它们的使用的解释性说明。内容在下表:
|
字段 |
描述 |
有效值 |
|
XML 命名空间 |
XML元素的命名空间 |
|
|
前缀 |
XML元素命名空间前缀 |
|
|
名称 |
XML元素名 |
|
|
类型 |
XML元素类型。 以下类型是当前支持的: String, Integer, Decimal, Boolean. 只要它是有效值列表中提到的值之一,就不会区分类型值的符号。 如果没有指定值,不会应用指定的XML/JSON转换指令,而是会执行默认的Jettison处理器逻辑。 |
String type string xs:string xsd:string Integer type int integer xs:integer xsd:integer Decimal type decimal numeric float xs:decimal xsd:decimal Boolean type bool boolean xs:boolean xsd:boolean |
|
数组类型 |
XML元素是否是数组的指示符。 只要它是有效值列表中提到的值之一,就不会区分类型值的符号。 如果没有指定值,数组指示符默认为false。 |
如果是数组: 1 true yes 如果不是数组: 0 false no |
|
默认值 |
在XML/JSON转换失败的情况下会赋给JSON元素的值。 例如,在上面给的demo中,元素“Quantity”的值会被作为整数处理。如果原始值不能转换为整数(比如含有字母),JSON输出会得到一个默认值。在该情况下,这个值是“0”。 需要注意的是,对于默认值而言,系统不会针对在“TYPE”中指定的类型进行元素类型检查——它会被当作字符串。在这种方式下,比如,你可以指定默认值“Invalid value”给“Quantity”。系统不会提示错误,无论是在communication channel激活的时候还是REST adapter运行期间处理相关消息的时候,即便默认值和元素类型(整型)完全不匹配。记住这点,应当注意设置默认值时要保持其类型的一致性。 |
Any value. 下面的值有点特别: “null” (带引号) – 被解释为字符串“null” null (无引号) – 被解释为null “” (只有引号 – 被解释为空字符串 |
本文链接:http://www.cnblogs.com/hhelibeb/p/7395567.html
英文原文:REST Adapter in PI/PO: Enhanced XML/JSON Conversion
参考阅读:PI REST Adapter – JSON to XML conversion,
REST Adapter实现SAP PI中的增强XML/JSON格式转换的更多相关文章
- REST Adapter实现SAP PI中的增强XML/JSON格式转换(转载)
SAP标准的REST adapter有着XML/JSON转换的功能,它很有用,因为一方面SAP PI/PO内部以XML格式处理数据,而另一方面,在处理REST架构风格的时候,JSON才是事实上的格式. ...
- UI5-技术篇-jQuery.ajax执行过程中Token验证及JSON格式传值问题
最近两天在测试OData服务类方法CREATE_DEEP_ENTITY及GET_EXPANDED_ENTITYSET,刚开始采用ODataModel方式调用没有任何问题,但是ODataModel采用的 ...
- JSON(二)——JavaScript中js对象与JSON格式字符串的相互转换
首先我们来看一下js中JSON格式的字符串 var JSONStr1 = "{\"name\" : \"张三\"}"; 注意以下的写法不是j ...
- 网络传输中利用fastjson将复杂嵌套数据类型Json格式转换(GeoJsonPolygon)
如果一个对象太复杂了,那么在网络传输键的JSON格式数据转换容易出问题. 比如下面一个类Area.java import lombok.AllArgsConstructor; import lombo ...
- Idea中:No converter found for return value of type: class java.util.ArrayList:Json格式转换问题
1.在搞SSM框架的时候,前端发送请求后,显示如下错误. @ResponseBody注解进行返回List<对象>的json数据时出现 nested exception is java.la ...
- 如何解决jersey框架中以json格式返回数组,当数组中元素一个时json格式不对
原文地址:http://www.cnblogs.com/swpk/p/3566536.html?utm_source=tuicool jersey 是oracle 出的一个较好的REST框架.使用此框 ...
- python2.7中关于编码,json格式的中文输出显示
当我们用requests请求一个返回json的接口时候, 语法是 result=requests.post(url,data).content print type(result),result 得到 ...
- jQuery中使用Ajax获取JSON格式数据示例代码
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.JSONM文件中包含了关于“名称”和“值”的信息.有时候我们需要读取JSON格式的数据文件,在jQuery中 ...
- Jmeter在Http Rest接口中自动生成签名(Json格式请求参数)
第一步: 签名的java类生成jar包,导入到jmeter的lib目录下(依赖的第三方包也要导入) 第二步:编写jmeter脚本,这里使用BeanShell 进行签名串的生成,目录结构如下: Bean ...
随机推荐
- mysql主从复制原理探索
上一篇文章里面,讲到了遇到mysql主从延迟的坑,对于这次的坑多说两句,以前也看过这样的例子,也知道不能够写完之后马上更新,但是真正开发的时候还是没有注意到这一点,道理大家都懂,但是还是会犯错,只有等 ...
- 005.Getting started with ASP.NET Core MVC and Visual Studio -- 【VS开发asp.net core mvc 入门】
Getting started with ASP.NET Core MVC and Visual Studio VS开发asp.net core mvc 入门 2017-3-7 2 分钟阅读时长 本文 ...
- Ambari安装之部署3个节点的HA分布式集群
前期博客 Ambari安装之部署单节点集群 其实,按照这个步骤是一样的.只是按照好3个节点后,再做下HA即可. 部署3个节点的HA分布式集群 (1)添加机器 和添加服务的操作类似,如下图 之后的添加a ...
- ZigZag - 曲折字符串
需求:将所给的字符串以“倒N型”输出,可以指定输出的行数函数 String convert(String s, int numRows)例如输入“abcdefghijklnmopqrstuvwxyz” ...
- thinkphp 面向切面编程-行为拓展
thinkphp的CBD模式 核心保留了最关键的部分,并在重要位置设置了标签用以标记,其他功能都采用行为扩展和驱动的方式组合,开发人员可以根据自己的需要,对某个标签位置进行行为扩展或者替换,就可以方便 ...
- RxSwift 系列(六) -- Mathematical and Aggregate Operators
前言 本篇文章将要学习RxSwift中数学和集合操作符,在RxSwift中包括了: toArray reduce concat toArray 将一个Observable序列转化为一个数组,并转换为一 ...
- jenkins外网slave配置
背景: 客户提供了测试服务器,但不能外网直连需要通过windows跳板进行进行连接. 方案设定将windows跳板机配置为远程slave节点. 技术支持: jenkins-slave windows ...
- (转)Maven项目标准目录结构
场景:工作中的项目都是使用Maven的目录结构,虽然能够如期的完成开发工作,但是对于一个Maven工程的配置却并不熟悉,这里主要介绍下Maven工程的而目录结构. 1 标准目录结构 src -main ...
- Java栈与堆 (转)
1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于C ...
- 内核对象kobject和sysfs(2)——kref分析
内核对象kobject和sysfs(2)--kref分析 在介绍ref之前,先贴上kref的结构: struct kref { atomic_t refcount; }; 可以看到,kref只是包含一 ...