Bạn đang xem tài liệu về Apigee Edge.
Truy cập vào tài liệu Apigee X. Thông tin
Nội dung
Chính sách này chuyển đổi thông báo từ định dạng Ký hiệu đối tượng JavaScript (JSON) sang ngôn ngữ đánh dấu có thể mở rộng (XML), cung cấp cho bạn một số lựa chọn để kiểm soát cách chuyển đổi thông báo.
Chính sách này đặc biệt hữu ích nếu bạn muốn chuyển đổi thông báo bằng XSL. Sau khi chuyển đổi tải trọng JSON sang XML, hãy sử dụng chính sách Biến đổi XSL với một biểu định kiểu tuỳ chỉnh để thực hiện quá trình biến đổi mà bạn cần.
Giả sử mục đích là chuyển đổi một yêu cầu có định dạng JSON thành một yêu cầu có định dạng XML, chính sách này sẽ được đính kèm vào một Luồng yêu cầu (ví dụ: Request / ProxyEndpoint/PostFlow).
Mẫu
Để biết thông tin chi tiết về việc chuyển đổi giữa JSON và XML, hãy xem Vấn đề chuyển đổi mảng JSON sang mảng XML trong đối tượng phản hồi.
Chuyển đổi yêu cầu
<JSONToXML name="jsontoxml">
<Source>request</Source>
<OutputVariable>request</OutputVariable>
</JSONToXML>Cấu hình này lấy thông báo yêu cầu ở định dạng JSON làm nguồn, sau đó tạo một thông báo ở định dạng XML được điền vào OutputVariable request. Edge tự động sử dụng nội dung của biến này làm thông báo cho bước xử lý tiếp theo.
Tham chiếu phần tử
Sau đây là các phần tử và thuộc tính mà bạn có thể định cấu hình trên chính sách này.
<JSONToXML async="false" continueOnError="false" enabled="true" name="JSON-to-XML-1"> <DisplayName>JSON to XML 1</DisplayName> <Source>request</Source> <OutputVariable>request</OutputVariable> <Options> <OmitXmlDeclaration>false</OmitXmlDeclaration> <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName> <NamespaceSeparator>:</NamespaceSeparator> <AttributeBlockName>#attrs</AttributeBlockName> <AttributePrefix>@</AttributePrefix> <ObjectRootElementName>Root</ObjectRootElementName> <ArrayRootElementName>Array</ArrayRootElementName> <ArrayItemElementName>Item</ArrayItemElementName> <Indent>false</Indent> <TextNodeName>#text</TextNodeName> <NullValue>I_AM_NULL</NullValue> <InvalidCharsReplacement>_</InvalidCharsReplacement> </Options> </JSONToXML>
Thuộc tính <JSONToXML>
Bảng sau đây mô tả những thuộc tính chung cho tất cả phần tử mẹ của chính sách:
| Thuộc tính | Mô tả | Mặc định | Sự hiện diện |
|---|---|---|---|
name |
Tên nội bộ của chính sách. Giá trị của thuộc tính (Không bắt buộc) Bạn có thể dùng phần tử |
Không áp dụng | Bắt buộc |
continueOnError |
Đặt thành Đặt thành |
false | Không bắt buộc |
enabled |
Hãy đặt thành Đặt thành |
đúng | Không bắt buộc |
async |
Thuộc tính này không được dùng nữa. |
false | Không được dùng nữa |
<DisplayName> phần tử
Hãy sử dụng cùng với thuộc tính name để gắn nhãn chính sách trong phần
trình chỉnh sửa proxy giao diện người dùng quản lý có tên ngôn ngữ tự nhiên khác.
<DisplayName>Policy Display Name</DisplayName>
| Mặc định |
Không áp dụng Nếu bạn bỏ qua phần tử này, giá trị của thuộc tính |
|---|---|
| Sự hiện diện | Không bắt buộc |
| Loại | Chuỗi |
Phần tử <Source>
Biến, yêu cầu hoặc phản hồi chứa thông báo JSON mà bạn muốn chuyển đổi thành XML.
Nếu bạn không xác định <Source>, thì giá trị này sẽ được coi là thông báo (giải quyết yêu cầu khi chính sách được đính kèm vào một luồng yêu cầu hoặc phản hồi khi chính sách được đính kèm vào một luồng phản hồi).
Nếu không thể phân giải biến nguồn hoặc phân giải thành một loại không phải thông báo, thì chính sách sẽ gửi một lỗi.
<Source>request</Source>
| Mặc định | yêu cầu hoặc phản hồi, được xác định bằng vị trí mà chính sách được thêm vào quy trình proxy API |
| Sự hiện diện | Không bắt buộc |
| Loại | tin nhắn |
Phần tử <OutputVariable>
Lưu trữ đầu ra của quá trình chuyển đổi định dạng JSON sang XML. Đây thường là giá trị giống như nguồn, tức là thường thì yêu cầu JSON sẽ được chuyển đổi thành yêu cầu XML.
Tải trọng của thông báo JSON được phân tích cú pháp và chuyển đổi thành XML, đồng thời tiêu đề Content-type HTTP của thông báo có định dạng XML được đặt thành text/xml;charset=UTF-8.
Nếu bạn không chỉ định OutputVariable, thì source sẽ được coi là OutputVariable. Ví dụ: nếu source là request, thì OutputVariable sẽ mặc định là request.
<OutputVariable>request</OutputVariable>
| Mặc định | yêu cầu hoặc phản hồi, được xác định bằng vị trí mà chính sách được thêm vào quy trình proxy API |
| Sự hiện diện | Phần tử này là bắt buộc khi biến được xác định trong phần tử <Source> thuộc loại chuỗi. |
| Loại | tin nhắn |
<Options>/<OmitXmlDeclaration>
Chỉ định bỏ qua không gian tên XML trong đầu ra. Giá trị mặc định là false, tức là đưa không gian tên vào đầu ra.
Ví dụ: chế độ cài đặt sau đây sẽ định cấu hình chính sách để bỏ qua không gian tên:
<OmitXmlDeclaration>true</OmitXmlDeclaration>
<Options>/<NamespaceBlockName>
<Options>/<DefaultNamespaceNodeName>
<Options>/<NamespaceSeparator>
JSON không hỗ trợ không gian tên, trong khi các tài liệu XML thường yêu cầu không gian tên.
NamespaceBlockName cho phép bạn xác định một thuộc tính JSON đóng vai trò là nguồn của định nghĩa không gian tên trong XML do chính sách tạo ra. (Điều này có nghĩa là JSON nguồn phải cung cấp một thuộc tính có thể được liên kết với một không gian tên mà ứng dụng dự kiến sẽ sử dụng XML kết quả.)
Ví dụ: các chế độ cài đặt sau:
<NamespaceBlockName>#namespaces</NamespaceBlockName> <DefaultNamespaceNodeName>$default</DefaultNamespaceNodeName> <NamespaceSeparator>:</NamespaceSeparator>
cho biết rằng một thuộc tính có tên là #namespaces tồn tại trong JSON nguồn chứa ít nhất một không gian tên được chỉ định làm mặc định. Ví dụ:
{
"population": {
"#namespaces": {
"$default": "http://www.w3.org/1999/people",
"exp": "http://www.w3.org/1999/explorers"
},
"person": "John Smith",
"exp:person": "Pedro Cabral"
}
}chuyển đổi thành:
<population xmlns="http://www.w3.org/1999/people" xmlns:exp="http://www.w3.org/1999/explorers"> <person>John Smith</person> <exp:person>Pedro Cabral</exp:person> </population>
<Options>/<ObjectRootElementName>
<ObjectRootElementName> chỉ định tên phần tử gốc khi bạn chuyển đổi từ JSON (không có phần tử gốc được đặt tên) sang XML.
Ví dụ: nếu JSON xuất hiện dưới dạng:
{
"abc": "123",
"efg": "234"
}Và bạn đặt <ObjectRootElementName> thành:
<ObjectRootElementName>Root</ObjectRootElementName>
XML kết quả sẽ có dạng như sau:
<Root> <abc>123</abc> <efg>234</efg> </Root>
<Options>/<AttributeBlockName>
<Options>/<AttributePrefix>
<AttributeBlockName> cho phép bạn chỉ định thời điểm các phần tử JSON được chuyển đổi thành các thuộc tính XML (thay vì các phần tử XML).
Ví dụ: chế độ cài đặt sau đây sẽ chuyển đổi các thuộc tính bên trong một đối tượng có tên là #attrs thành các thuộc tính XML:
<AttributeBlockName>#attrs</AttributeBlockName>
Đối tượng JSON sau:
{
"person" : {
"#attrs" : {
"firstName" : "John",
"lastName" : "Smith"
},
"occupation" : "explorer",
}
}được chuyển đổi thành cấu trúc XML sau:
<person firstName="John" lastName="Smith"> <occupation>explorer</occupation> </person>
<AttributePrefix> chuyển đổi thuộc tính bắt đầu bằng tiền tố đã chỉ định thành các thuộc tính XML. Trong đó, tiền tố thuộc tính được đặt thành @, ví dụ:
<AttributePrefix>@</AttributePrefix>
Chuyển đổi đối tượng JSON sau đây:
{ "person" : { "@firstName" : "John", "@lastName" : "Smith" "occupation" : "explorer", } }
thành cấu trúc XML sau:
<person firstName="John" lastName="Smith"> <occupation>explorer</occupation> </person>
<Options>/<ArrayRootElementName>
Phần tử <Options>/<ArrayItemElementName>
Chuyển đổi một mảng JSON thành danh sách các phần tử XML có tên phần tử mẹ và phần tử con được chỉ định.
Ví dụ: các chế độ cài đặt sau:
<ArrayRootElementName>Array</ArrayRootElementName> <ArrayItemElementName>Item</ArrayItemElementName>
chuyển đổi mảng JSON sau:
[
"John Cabot",
{
"explorer": "Pedro Cabral"
},
"John Smith"
]thành cấu trúc XML sau:
<Array>
<Item>John Cabot</Item>
<Item>
<explorer>Pedro Cabral</explorer>
</Item>
<Item>John Smith</Item>
</Array><Options>/<Indent>
Chỉ định thụt lề đầu ra XML. Giá trị mặc định là false, nghĩa là không thụt lề.
Ví dụ: chế độ cài đặt sau đây sẽ định cấu hình chính sách để thụt lề đầu ra:
<Indent>true</Indent>
Nếu dữ liệu đầu vào JSON có dạng:
{"n": [1, 2, 3] }Sau đó, kết quả không có thụt lề là:
<Array><n>1</n><n>2</n><n>3</n></Array>
Khi bật tính năng thụt lề, kết quả sẽ là:
<Array>
<n>1</n>
<n>2</n>
<n>3</n>
</Array>Phần tử <Options>/<TextNodeName>
Chuyển đổi một thuộc tính JSON thành một nút văn bản XML có tên được chỉ định. Ví dụ: chế độ cài đặt sau:
<TextNodeName>age</TextNodeName>
chuyển đổi JSON này:
{
"person": {
"firstName": "John",
"lastName": "Smith",
"age": 25
}
}sang cấu trúc XML này:
<person> <firstName>John</firstName>25<lastName>Smith</lastName> </person>
Nếu bạn không chỉ định TextNodeName, XML sẽ được tạo bằng chế độ cài đặt mặc định cho một nút văn bản:
<person> <firstName>John</firstName> <age>25</age> <lastName>Smith</lastName> </person>
Phần tử <Options>/<NullValue>
Cho biết giá trị rỗng. Theo mặc định, giá trị này là NULL.
Ví dụ: chế độ cài đặt sau:
<NullValue>I_AM_NULL</NullValue>
{"person" : "I_AM_NULL"}đến phần tử XML sau:
<person></person>
Nếu không có giá trị nào (hoặc một giá trị khác ngoài I_AM_NULL) được chỉ định cho giá trị Null, thì tải trọng tương tự sẽ chuyển đổi thành:
<person>I_AM_NULL</person>
Phần tử <Options>/<InvalidCharsReplacement>
Để hỗ trợ xử lý XML không hợp lệ có thể gây ra vấn đề với trình phân tích cú pháp, chế độ cài đặt này sẽ thay thế mọi phần tử JSON tạo ra XML không hợp lệ bằng chuỗi. Ví dụ: chế độ cài đặt sau đây:
<InvalidCharsReplacement>_</InvalidCharsReplacement>
Chuyển đổi đối tượng JSON này
{
"First%%%Name": "John"
}sang cấu trúc XML này:
<First_Name>John<First_Name>
Lưu ý về cách sử dụng
Trong một kịch bản dàn xếp điển hình, chính sách JSON sang XML trong luồng yêu cầu đến thường được ghép nối với chính sách XML sang JSON trong luồng phản hồi đi. Bằng cách kết hợp các chính sách theo cách này, một API JSON có thể được hiển thị cho các dịch vụ chỉ hỗ trợ XML một cách tự nhiên.
Bạn nên áp dụng chính sách JSON sang XML mặc định (trống) và lặp lại việc thêm các phần tử cấu hình khi cần.
Đối với những trường hợp mà các API được sử dụng bởi nhiều ứng dụng khách có thể yêu cầu JSON và XML, bạn có thể thiết lập định dạng của phản hồi một cách linh hoạt bằng cách định cấu hình các chính sách JSON sang XML và XML sang JSON để thực thi có điều kiện. Hãy xem Các biến và điều kiện của luồng để biết cách triển khai trường hợp này.
Giản đồ
Tham chiếu lỗi
Phần này mô tả các mã lỗi và thông báo lỗi được trả về cũng như các biến lỗi do Edge đặt khi chính sách này kích hoạt lỗi. Thông tin này rất quan trọng nếu bạn đang phát triển các quy tắc lỗi để xử lý lỗi. Để tìm hiểu thêm, hãy xem bài viết Những điều bạn cần biết về lỗi chính sách và Xử lý lỗi.
Lỗi thời gian chạy
Những lỗi này có thể xảy ra khi chính sách này thực thi.
| Mã lỗi | Trạng thái HTTP | Nguyên nhân | Khắc phục |
|---|---|---|---|
steps.jsontoxml.ExecutionFailed |
500 | Tải trọng đầu vào (JSON) trống hoặc dữ liệu đầu vào (JSON) được chuyển vào chính sách JSON sang XML là không hợp lệ hoặc sai định dạng. | build |
steps.jsontoxml.InCompatibleTypes |
500 | Lỗi này xảy ra nếu loại biến được xác định trong phần tử <Source> và
phần tử <OutputVariable> không giống nhau. Bắt buộc là loại
biến có trong phần tử <Source> và phần tử <OutputVariable>
kết quả phù hợp. Có các loại hợp lệ là message và string. |
build |
steps.jsontoxml.InvalidSourceType |
500 | Lỗi này xảy ra nếu loại biến dùng để xác định phần tử <Source>
không hợp lệ. Các loại biến hợp lệ là message và string. |
build |
steps.jsontoxml.OutputVariableIsNotAvailable |
500 | Lỗi này xảy ra nếu biến được chỉ định trong phần tử <Source> của JSON thành
Chính sách XML thuộc loại chuỗi và phần tử <OutputVariable> không được xác định.
Phần tử <OutputVariable> là bắt buộc khi biến được xác định trong <Source>
thuộc loại chuỗi. |
build |
steps.jsontoxml.SourceUnavailable |
500 |
Lỗi này xảy ra nếu thông báo
biến được chỉ định trong phần tử <Source> của chính sách JSON sang XML là:
|
build |
Lỗi triển khai
Không có.
Biến lỗi
Các biến này được đặt khi xảy ra lỗi thời gian chạy. Để biết thêm thông tin, hãy xem bài viết Những điều bạn cần biết về lỗi chính sách.
| Biến | Trong đó | Ví dụ: |
|---|---|---|
fault.name="fault_name" |
fault_name là tên của lỗi, như được liệt kê trong bảng Lỗi thời gian chạy ở trên. Tên lỗi là phần cuối cùng của mã lỗi. | fault.name Matches "SourceUnavailable" |
jsontoxml.policy_name.failed |
policy_name là tên do người dùng chỉ định của chính sách gây ra lỗi. | jsontoxml.JSON-to-XML-1.failed = true |
Ví dụ về phản hồi khi gặp lỗi
{
"fault": {
"faultstring": "JSONToXML[JSON-to-XML-1]: Source xyz is not available",
"detail": {
"errorcode": "steps.json2xml.SourceUnavailable"
}
}
}Ví dụ về quy tắc lỗi
<FaultRule name="JSON To XML Faults">
<Step>
<Name>AM-SourceUnavailableMessage</Name>
<Condition>(fault.name Matches "SourceUnavailable") </Condition>
</Step>
<Step>
<Name>AM-BadJSON</Name>
<Condition>(fault.name = "ExecutionFailed")</Condition>
</Step>
<Condition>(jsontoxml.JSON-to-XML-1.failed = true) </Condition>
</FaultRule>Chủ đề có liên quan
- XML sang JSON: Chính sách XML sang JSON
- Biến đổi XSL: Chính sách Biến đổi XSL