Chính sách JSONtoXML

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến Tài liệu về Apigee X.
thông tin

Nội dung

Chính sách này chuyển đổi các thông báo từ định dạng JavaScript Object Notation (JSON) thành định dạng có thể mở rộng ngôn ngữ đánh dấu (XML), cung cấp cho bạn một vài tuỳ chọn để kiểm soát cách chuyển đổi thư.

Chính sách này đặc biệt hữu ích nếu bạn muốn chuyển đổi tin nhắn bằng ABI. Sau chuyển đổi tải trọng JSON sang XML, hãy sử dụng chính sách Chuyển đổi BII với biểu định kiểu tuỳ chỉnh để thực hiện phép biến đổi cần thiết.

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 sẽ được đính kèm vào Luồng yêu cầu (ví dụ: Request / ProxyEndpoint / PostFlow).

Mẫu

Để thảo luận chi tiết về cách chuyển đổi giữa JSON và XML, vui lòng xem http://community.apigee.com/articles/1839/converting-between-xml-and-json-what-you-need-to-k.html.

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 Thông báo ở định dạng XML được điền sẵn trong OutputVariable request. Cạnh 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ể thiết lập theo 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>

&lt;JSONToXML&gt; thuộc tính

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 name có thể chứa chữ cái, số, dấu cách, dấu gạch nối, dấu gạch dưới và dấu chấm. Giá trị này không được vượt quá 255 ký tự.

(Không bắt buộc) Bạn có thể dùng phần tử <DisplayName> để gắn nhãn chính sách trong trình chỉnh sửa proxy giao diện người dùng quản lý bằng tên ngôn ngữ tự nhiên khác.

Không áp dụng Bắt buộc
continueOnError

Đặt thành false để trả về lỗi khi chính sách không thành công. Điều này là dự kiến đối với hầu hết các chính sách.

Đặt thành true để tiếp tục thực thi luồng ngay cả sau khi có chính sách không thành công.

false Không bắt buộc
enabled

Hãy đặt thành true để thực thi chính sách này.

Đặt thành false để tắt chính sách này. Chính sách này sẽ không được thực thi ngay cả khi luồng đó vẫn được liên kết với một luồng.

đú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

&lt;DisplayName&gt; 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 name của chính sách sẽ là đã sử dụng.

Sự hiện diện Không bắt buộc
Loại Chuỗi

&lt;Source&gt; phần tử

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ì đó sẽ được coi là thông báo (sẽ giải quyết vấn đề này để yêu cầu khi chính sách này được đính kèm vào quy trình yêu cầu hoặc phản hồi khi chính sách được đính kèm vào quy trình phản hồi).

Nếu biến nguồn không thể được phân giải hoặc phân giải thành một loại không phải là thông báo, thì chính sách gửi lỗi.

<Source>request</Source>
Mặc định yêu cầu hoặc phản hồi, được xác định theo vị trí mà chính sách được thêm vào luồng proxy API
Sự hiện diện Không bắt buộc
Loại tin nhắn

&lt;OutputVariable&gt; phần tử

Lưu trữ đầu ra của quá trình chuyển đổi định dạng JSON sang XML. Giá trị này thường giống với nguồn, tức là thường thì yêu cầu JSON đượ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 và loại nội dung HTTP phần đầu thư của thông báo theo định dạng XML được đặt thành text/xml;charset=UTF-8.

Nếu không chỉ định OutputVariable, source sẽ được coi là OutputVariable. Ví dụ: nếu sourcerequest, thì OutputVariable 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 theo vị trí mà chính sách được thêm vào luồng 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

&lt;Options&gt;/&lt;OmitXmlDeclaration&gt;

Chỉ định để loại bỏ không gian tên XML khỏi kết quả. Giá trị mặc định là false nghĩa là đưa không gian tên vào dữ liệu đầ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>

&lt;Options&gt;/&lt;NamespaceBlockName&gt;
&lt;Options&gt;/&lt;DefaultNamespaceNodeName&gt;
&lt;Options&gt;/&lt;NamespaceSeparator&gt; phần tử

JSON không hỗ trợ vùng chứa tên, trong khi các tài liệu XML thường yêu cầu vùng chứa 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 không gian tên định nghĩa 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ào một không gian tên mà ứng dụng mong đợi 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 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 không gian tên 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>

&lt;Options&gt;/&lt;ObjectRootElementName&gt;

&lt;ObjectRootElementName&gt; chỉ định tên phần tử gốc khi bạn chuyển đổi từ JSON (không có 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 &lt;ObjectRootElementName&gt; là:

<ObjectRootElementName>Root</ObjectRootElementName>

XML kết quả có dạng:

<Root>
   <abc>123</abc>
   <efg>234</efg>
</Root>

&lt;Options&gt;/&lt;AttributeBlockName&gt;
&lt;Options&gt;/&lt;AttributePrefix&gt; phần tử

<AttributeBlockName> cho phép bạn chỉ định thời điểm các phần tử JSON được được chuyển đổi thành thuộc tính XML (thay vì phần tử XML).

Ví dụ: chế độ cài đặt sau đây chuyển đổi các thuộc tính bên trong một đối tượng có tên #attrs vào các thuộc tính XML:

<AttributeBlockName>#attrs</AttributeBlockName>

Đối tượng JSON sau:

{
    "person" : {
        "#attrs" : {
            "firstName" : "John",
            "lastName" : "Smith"
        },        
        "occupation" : "explorer",
    }
}

sẽ được chuyển đổi sang 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 vào các thuộc tính XML. Trong trường hợp tiền tố thuộc tính được đặt thành @, ví dụ:

<AttributePrefix>@</AttributePrefix>

Chuyển đổi đối tượng JSON sau:

{
"person" : {
   "@firstName" : "John",
   "@lastName" : "Smith"
   "occupation" : "explorer",

 }
}

cho cấu trúc XML sau:

<person firstName="John" lastName="Smith">
  <occupation>explorer</occupation>
</person>

&lt;Options&gt;/&lt;ArrayRootElementName&gt;
&lt;Options&gt;/&lt;ArrayItemElementName&gt; phần tử

Chuyển đổi một mảng JSON thành danh sách các phần tử XML có phần tử mẹ và phần tử con được chỉ định tên.

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>

&lt;Options&gt;/&lt;Indent&gt;

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 đị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 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>

&lt;Options&gt;/&lt;TextNodeName&gt; phần tử

Chuyển đổi một thuộc tính JSON thành một nút văn bản XML có tên đã chỉ định. Ví dụ: cài đặt sau đây:

<TextNodeName>age</TextNodeName>

chuyển đổi JSON này:

{
    "person": {
        "firstName": "John",
        "lastName": "Smith",
        "age": 25
    }
}

vào 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 theo 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>

&lt;Options&gt;/&lt;NullValue&gt; phần tử

Biểu thị một giá trị rỗng. Theo mặc định, giá trị là NULL.

Ví dụ: chế độ cài đặt sau đây:

<NullValue>I_AM_NULL</NullValue>
Chuyển đổi đối tượng JSON sau:
{"person" : "I_AM_NULL"}

vào phần tử XML sau:

<person></person>

Khi không có giá trị nào (hoặc một giá trị không phải I_AM_NULL) được chỉ định cho giá trị Null, thì cùng một tải trọng đó sẽ chuyển đổi thành:

<person>I_AM_NULL</person>

&lt;Options&gt;/&lt;InvalidCharsReplacement&gt; phần tử

Để hỗ trợ xử lý XML không hợp lệ có thể gây ra sự cố cho trình phân tích cú pháp, chế độ cài đặt này sẽ thay thế bất kỳ phần tử JSON nào tạo XML không hợp lệ chứa chuỗi. Ví dụ: như sau cài đặt:

<InvalidCharsReplacement>_</InvalidCharsReplacement>

Chuyển đổi đối tượng JSON này

{
    "First%%%Name": "John"
}

vào cấu trúc XML này:

<First_Name>John<First_Name>

Lưu ý về cách sử dụng

Trong trường hợp dàn xếp điển hình, chính sách JSON thành XML trong luồng yêu cầu đến thường kết hợp với chính sách XMLtoJSON trên quy trình phản hồi đi. Bằng cách kết hợp các chính sách theo cách này, API JSON có thể xuất hiện đối với các dịch vụ vốn chỉ hỗ trợ XML.

Thông thường, bạn nên áp dụng JSON mặc định (trống) cho chính sách XML và liên tục thêm các phần tử cấu hình theo yêu cầu.

Đối với các trường hợp API được sử dụng bởi các ứng dụng khác nhau có thể yêu cầu JSON và XML, định dạng của phản hồi có thể được đặt một cách linh động bằng cách định cấu hình JSON thành XML và XML để Chính sách JSON để thực thi có điều kiện. Xem Các biến và điều kiện của luồng để triển khai tình huống 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áchXử 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.
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à messagestring.
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à messagestring.
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.
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à:
  • ngoài phạm vi (không áp dụng trong quy trình cụ thể nơi chính sách đang được thực thi) hoặc
  • không thể giải quyết (không xác định)

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