1. 程式人生 > >REST Adapter實現SAP PI中的增強XML/JSON格式轉換

REST Adapter實現SAP PI中的增強XML/JSON格式轉換

body edit con adding target end als XML editor

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格式轉換