Chính sách XMLtoJSON

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 thông báo từ định dạng ngôn ngữ đánh dấu có thể mở rộng (XML) sang JavaScript Ký hiệu đối tượng (JSON), cung cấp cho bạn nhiều lựa chọn để kiểm soát cách thông báo được đã chuyển đổi.

Giả sử mục đích là chuyển đổi phản hồi có định dạng XML thành định dạng JSON phản hồi, chính sách này sẽ được đính kèm vào Luồng phản hồi (ví dụ: Phản hồi / ProxyEndpoint) / PostFlow).

Giới thiệu

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 ghép nối với chính sách XML sang JSON trên luồng phản hồi gử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ụ phụ trợ vốn chỉ hỗ trợ XML.

Đối với các trường hợp API được sử dụng bởi nhiều ứng dụng khách có thể yêu cầu JSON hoặc XML, định dạng phản hồi có thể được thiết lập một cách linh động bằng cách định cấu hình JSON thành XML và XML thành 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.


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.

Đang chuyển đổi câu trả lời

<XMLToJSON name="ConvertToJSON">
  <Options>
  </Options>
  <OutputVariable>response</OutputVariable>
  <Source>response</Source>
</XMLToJSON>

Cấu hình này là cấu hình tối thiểu cần thiết để chuyển đổi XML sang JSON – lấy thông báo phản hồi có định dạng XML làm nguồn, sau đó tạo một Thông báo theo định dạng JSON được điền sẵn trong OutputVariable response. 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.

<XMLToJSON async="false" continueOnError="false" enabled="true" name="XML-to-JSON-1">
    <DisplayName>XML to JSON 1</DisplayName>
    <Source>response</Source>
    <OutputVariable>response</OutputVariable>
    <Options>
        <RecognizeNumber>true</RecognizeNumber>
        <RecognizeBoolean>true</RecognizeBoolean>
        <RecognizeNull>true</RecognizeNull>
        <NullValue>NULL</NullValue>
        <NamespaceBlockName>#namespaces</NamespaceBlockName>
        <DefaultNamespaceNodeName>&</DefaultNamespaceNodeName>
        <NamespaceSeparator>***</NamespaceSeparator>
        <TextAlwaysAsProperty>true</TextAlwaysAsProperty>
        <TextNodeName>TEXT</TextNodeName>
        <AttributeBlockName>FOO_BLOCK</AttributeBlockName>
        <AttributePrefix>BAR_</AttributePrefix>
        <OutputPrefix>PREFIX_</OutputPrefix>
        <OutputSuffix>_SUFFIX</OutputSuffix>
        <StripLevels>2</StripLevels>
        <TreatAsArray>
            <Path unwrap="true">teachers/teacher/studentnames/name</Path>
        </TreatAsArray>
    </Options>
    <!-- Use Options or Format, not both -->
    <Format>yahoo</Format>
</XMLToJSON>

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

<XMLtoJSON async="false" continueOnError="false" enabled="true" name="XML-to-JSON-1"> 

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 XML mà bạn muốn chuyển đổi thành JSON.

Tiêu đề loại nội dung HTTP của thông báo nguồn phải được đặt thành application/xml, nếu không, chính sách này sẽ không được thực thi.

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>response</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ữ kết quả của quá trình chuyển đổi định dạng XML sang JSON. Giá trị này thường giống với nguồn, tức là phản hồi XML thường được chuyển đổi thành phản hồi JSON.

Tải trọng của thông báo XML được phân tích cú pháp và chuyển đổi thành JSON, 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 application/json.

Nếu bạn không chỉ định OutputVariable, source sẽ được coi là OutputVariable. Ví dụ: nếu sourceresponse, thì OutputVariable mặc định là response.

<OutputVariable>response</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;

Các tuỳ chọn cho phép bạn kiểm soát quá trình chuyển đổi từ XML sang JSON. Sử dụng <Options>, cho phép bạn thêm các chế độ cài đặt lượt chuyển đổi cụ thể hoặc <Format> cho phép bạn tham chiếu mẫu của các tuỳ chọn định sẵn. Bạn không thể sử dụng cả <Options><Format>.

Bạn phải nhập <Options> nếu không dùng <Format>.

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

Nếu đúng, thì các trường số trong tải trọng XML sẽ giữ nguyên định dạng ban đầu.

<RecognizeNumber>true</RecognizeNumber>

Hãy xem ví dụ XML sau:

<a>
  <b>100</b>
  <c>value</c>
</a>

Nếu true, chuyển đổi thành:

{
    "a": {
        "b": 100,
        "c": "value"
    }
}

Nếu false, chuyển đổi thành:

{
    "a": {
        "b": "100",
        "c": "value"
    }
}
Mặc định false
Sự hiện diện Không bắt buộc
Loại Boolean

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

Cho phép lượt chuyển đổi duy trì giá trị boolean true/false thay vì chuyển các giá trị đó thành .

<RecognizeBoolean>true</RecognizeBoolean>

Trong ví dụ XML sau:

<a>
  <b>true</b>
  <c>value</c>
</a>

Nếu true, chuyển đổi thành:

{
    "a": {
        "b": true,
        "c": "value"
    }
}

Nếu false, chuyển đổi thành:

{
    "a": {
        "b": "true",
        "c": "value"
    }
}
Mặc định false
Sự hiện diện Không bắt buộc
Loại Boolean

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

Cho phép bạn chuyển đổi các giá trị trống thành giá trị rỗng.

<RecognizeNull>true</RecognizeNull>

Đối với XML sau:

<a>
  <b></b>
  <c>value</c>
</a>

Nếu true, chuyển đổi thành:

{
  "a": {
    "b": null,
    "c": "value"
  }
}

Nếu false, chuyển đổi thành:

{
  "a": {
    "b": {},
    "c": "value"
  }
}
Mặc định false
Sự hiện diện Không bắt buộc
Loại Boolean

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

Cho biết giá trị cần được nhận dạng với các giá trị rỗng trong thông báo nguồn đã chuyển đổi. Theo mặc định, giá trị là null. Lựa chọn này chỉ có hiệu lực nếu RecognizeNull là đúng.

<NullValue>not-present</NullValue>

Mặc định null
Sự hiện diện Không bắt buộc
Loại Chuỗi

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

Sử dụng các phần tử này cùng nhau.

<NamespaceBlockName>#namespaces</NamespaceBlockName>
<DefaultNamespaceNodeName>&</DefaultNamespaceNodeName>
<NamespaceSeparator>***</NamespaceSeparator>

Hãy xem ví dụ XML sau:

<a xmlns="http://ns.com" xmlns:ns1="http://ns1.com">
  <ns1:b>value</ns1:b>
</a>

Nếu bạn không chỉ định NamespaceSeparator, cấu trúc JSON sau sẽ là đã tạo:

{
    "a": {
        "b": "value"
    }
}

Nếu các phần tử NamespaceBlockName, DefaultNamespaceNodeNameNamespaceSeparator được chỉ định là #namespaces, &, và *** thì cấu trúc JSON sau sẽ được tạo:

{
    "a": {
        "#namespaces": {
            "&": "http://ns.com",
            "ns1": "http://ns1.com"
        },
        "ns1***b": "value"
    }
}
Mặc định Hãy xem các ví dụ ở trên.
Sự hiện diện Không bắt buộc
Tuy nhiên, nếu chỉ định <NamespaceBlockName>, bạn cũng phải chỉ định hai phần tử khác.
Loại Chuỗi

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

Sử dụng các phần tử này cùng nhau.

Nếu bạn đặt thành true, nội dung của phần tử XML sẽ được chuyển đổi thành một chuỗi thuộc tính này.

<TextAlwaysAsProperty>true</TextAlwaysAsProperty>
<TextNodeName>TEXT</TextNodeName>

Đối với XML sau:

<a>
  <b>value1</b>
  <c>value2<d>value3</d>value4</c>
</a>

Nếu bạn đặt TextAlwaysAsProperty thành trueTextNodeName được chỉ định là TEXT, thì cấu trúc JSON sau sẽ được tạo:

{
  "a": {
    "b": {
      "TEXT": "value1"
    },
    "c": {
      "TEXT": [
        "value2",
        "value4"
        ],
        "d": {
          "TEXT": "value3"
        }
      }
    }
}

Nếu bạn đặt TextAlwaysAsProperty thành falseTextNodeName được chỉ định là TEXT, cấu trúc JSON sau đây là đã tạo:

{
  "a": {
    "b": "value1",
    "c": {
      "TEXT": [
        "value2",
        "value4"
      ],
      {
        "d": "value3",
      }
    }
}
Mặc định <TextAlwaysAsProperty>: sai
<TextNodeName>: Không có
Sự hiện diện Không bắt buộc
Loại <TextAlwaysAsProperty>: Boolean
<TextNodeName>: Chuỗi

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

Sử dụng các phần tử này cùng nhau.

Cho phép bạn nhóm các giá trị thành một khối JSON và thêm tiền tố vào tên thuộc tính.

<AttributeBlockName>FOO_BLOCK</AttributeBlockName>
<AttributePrefix>BAR_</AttributePrefix>

Hãy xem ví dụ XML sau:

<a attrib1="value1" attrib2="value2"/>

Nếu cả hai thuộc tính (AttributeBlockNameAttributePrefix) đều là chỉ định như xác định trong ví dụ từ XML sang JSON, cấu trúc JSON sau sẽ được tạo:

{
  "a": {
    "FOO_BLOCK": {
      "BAR_attrib1": "value1",
      "BAR_attrib2": "value2"
    }
  }
}

Nếu bạn chỉ chỉ định AttributeBlockName, cấu trúc JSON sau đây sẽ đã tạo:

{
    "a": {
        "FOO_BLOCK": {
            "attrib1": "value1",
            "attrib2": "value2"
        }
    }
}

Nếu bạn chỉ chỉ định AttributePrefix, cấu trúc JSON sau đây sẽ đã tạo:

{
    "a": {
        "BAR_attrib1": "value1",
        "BAR_attrib2": "value2"
    }
}

Nếu bạn không chỉ định đối tượng nào, thì cấu trúc JSON sau sẽ được tạo:

{
    "a": {
        "attrib1": "value1",
        "attrib2": "value2"
    }
}
Mặc định Hãy xem các ví dụ ở trên.
Sự hiện diện Không bắt buộc
Loại Chuỗi

&lt;Options&gt;/&lt;OutputPrefix&gt;
&lt;Options&gt;/&lt;OutputSuffix&gt; phần tử

Sử dụng các phần tử này cùng nhau.

<OutputPrefix>PREFIX_</OutputPrefix>
<OutputSuffix>_SUFFIX</OutputSuffix>

Hãy xem ví dụ XML sau:

<a>value</a>

Nếu bạn chỉ định cả hai thuộc tính (OutputPrefixOutputSuffix) như đã xác định trong ví dụ từ XML sang JSON, cấu trúc JSON sau sẽ được tạo:

PREFIX_{
    "a": "value"
}_SUFFIX

Nếu bạn chỉ chỉ định OutputPrefix, thì cấu trúc JSON sau sẽ được tạo:

PREFIX_{
  "a" : "value"
}

Nếu bạn chỉ chỉ định OutputSuffix, thì cấu trúc JSON sau sẽ được tạo:

{
  "a" : "value"
}_SUFFIX

Nếu cả OutputPrefixOutputSuffix đều không được chỉ định, thì hàm sau Cấu trúc JSON được tạo:

{
    "a": "value"
}
Mặc định Hãy xem các mẫu ở trên.
Sự hiện diện Không bắt buộc
Loại Chuỗi

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

<Options>
    <StripLevels>4</StripLevels>
</Options>

Đôi khi, các tải trọng XML (chẳng hạn như SOAP) có nhiều cấp độ mẹ mà bạn không muốn đưa vào JSON được chuyển đổi. Dưới đây là ví dụ về phản hồi SOAP chứa nhiều cấp:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/Schemata-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
      <GetCityWeatherByZIPResponse xmlns="http://ws.cdyne.com/WeatherWS/">
          <GetCityWeatherByZIPResult>
              <State>CO</State>
              <City>Denver</City>
              <Description>Sunny</Description>
              <Temperature>62</Temperature>
          </GetCityWeatherByZIPResult>
      </GetCityWeatherByZIPResponse>
  </soap:Body>
</soap:Envelope>

Có 4 cấp trước khi bạn chuyển đến cấp Tiểu bang, Thành phố, Nội dung mô tả và Nhiệt độ. Nếu không sử dụng <StripLevels>, phản hồi JSON được chuyển đổi sẽ trông giống như sau:

{
   "Envelope" : {
      "Body" : {
         "GetCityWeatherByZIPResponse" : {
            "GetCityWeatherByZIPResult" : {
               "State" : "CO",
               "City" : "Denver",
               "Description" : "Sunny",
               "Temperature" : "62"
            }
         }
      }
   }
}

Nếu muốn xoá 4 cấp đầu tiên đó trong phản hồi JSON, bạn nên đặt <StripLevels>4</StripLevels>, sẽ cung cấp cho bạn: JSON:

{
  "State" : "CO",
  "City" : "Denver",
  "Description" : "Sunny",
  "Temperature" : "62"
}

Bạn có thể bỏ các cấp độ lên đến phần tử đầu tiên chứa nhiều phần tử con. Tác dụng có nghĩa là gì? Hãy xem một ví dụ về JSON phức tạp hơn:

{
   "Envelope" : {
      "Body" : {
         "GetCityForecastByZIPResponse" : {
            "GetCityForecastByZIPResult" : {
               "ResponseText" : "City Found",
               "ForecastResult" : {
                  "Forecast" : [
                     {
                        "ProbabilityOfPrecipiation" : {
                           "Nighttime" : "00",
                           "Daytime" : 10
                        }  ...

Cấp 3 trong ví dụ này là GetCityForecastByZIPResponse, chỉ có một con. Vì vậy, nếu bạn định sử dụng <StripLevels>3</StripLevels> (hãy xoá 3 cấp độ đầu tiên), JSON sẽ có dạng như sau:

{
   "GetCityForecastByZIPResult" : {
      "ResponseText" : "City Found",
      "ForecastResult" : {
         "Forecast" : [
            {
               "ProbabilityOfPrecipiation" : {
                  "Nighttime" : "00",
                  "Daytime" : 10
               }  ...

Lưu ý GetCityForecastByZIPResult có nhiều phần tử con. Vì đó là phần tử đầu tiên chứa nhiều phần tử con, bạn có thể bỏ cấp cuối cùng này bằng cách sử dụng <StripLevels>4</StripLevels>, sẽ cung cấp cho bạn những thông tin sau JSON:

{
   "ResponseText" : "City Found",
   "ForecastResult" : {
      "Forecast" : [
         {
            "ProbabilityOfPrecipiation" : {
               "Nighttime" : "00",
               "Daytime" : 10
            }  ...

Vì cấp 4 là cấp đầu tiên chứa nhiều phần tử con nên bạn không thể loại bỏ bất kỳ cấp nào thấp hơn thế này. Nếu bạn đặt mức dải thành 5, 6, 7, v.v., bạn sẽ tiếp tục nhận được câu trả lời ở trên.

Mặc định 0 (không có tính năng loại bỏ cấp độ)
Sự hiện diện Không bắt buộc
Loại Số nguyên

&lt;Options&gt;/&lt;TreatAsArray&gt;/&lt;Path&gt; phần tử

<Options>
    <TreatAsArray>
        <Path unwrap="true">teachers/teacher/studentnames/name</Path>
    </TreatAsArray>
</Options>

Tổ hợp phần tử này giúp bạn đảm bảo rằng các giá trị trong tài liệu XML được đưa vào định dạng JSON . Điều này hữu ích, ví dụ như khi số lượng phần tử con có thể thay đổi (từ 1 đến nhiều) và bạn muốn đảm bảo các giá trị luôn nằm trong một mảng. Cách này giúp đảm bảo mã ổn định vì bạn có thể lấy dữ liệu qua mảng theo cách giống nhau mọi lúc. Cho ví dụ: $.teachers.teacher.studentnames[0] nhận giá trị tên đầu tiên của học viên trong mảng bất kể số lượng giá trị trong mảng.

Hãy nhìn lại hành vi mặc định của XML sang JSON, sau đó tìm hiểu cách kiểm soát đầu ra bằng <TreatAsArray>/<Path>.

Khi một tài liệu XML chứa một phần tử có nhiều giá trị con (thường dựa trên giản đồ trong đó maxOccurs='unbounded' của phần tử), thì chính sách XML sang JSON sẽ tự động đặt các giá trị đó vào một mảng. Ví dụ: khối XML sau

<teacher>
    <name>teacherA</name>
    <studentnames>
        <name>student1</name>
        <name>student2</name>
    </studentnames>
</teacher>

...được tự động chuyển đổi thành JSON sau mà không cần chính sách đặc biệt cấu hình:

{
  "teachers" : {
      "teacher" : {
          "name" : "teacherA",
          "studentnames" : {
              "name" : [
                 "student1",
                 "student2"
              ]}
           }
      }
}

Lưu ý rằng 2 tên học viên được đưa vào một mảng.

Tuy nhiên, nếu chỉ có một học viên xuất hiện trong tài liệu XML, thì chính sách từ XML sang JSON sẽ tự động coi giá trị là một chuỗi đơn, không phải là một mảng chuỗi, như minh hoạ sau ví dụ:

{
  "teachers" : {
      "teacher" : {
          "name" : "teacherA",
          "studentnames" : {
              "name" : "student1"
              }
          }
      }
}

Trong các ví dụ trước, dữ liệu tương tự đã được chuyển đổi theo cách khác nhau, một lần dưới dạng mảng, một lần khác là một chuỗi đơn. Đây là nơi phần tử <TreatAsArray>/<Path> cho phép bạn kiểm soát đầu ra. Chẳng hạn, bạn có thể đảm bảo luôn nhập tên của các học viên một mảng ngay cả khi chỉ có một giá trị. Bạn định cấu hình điều này bằng cách xác định Đường dẫn đến phần tử có các giá trị bạn muốn đặt vào một mảng, như sau:

<Options>
    <TreatAsArray>
        <Path>teachers/teacher/studentnames/name</Path>
    </TreatAsArray>
</Options>

Cấu hình ở trên sẽ viết JSON như sau:

{
  "teachers" : {
      "teacher" : {
          "name" : "teacherA",
          "studentnames" : {
              "name" : ["student1"]
              }
            ]
          }
      }
}

Xin lưu ý rằngstudent1 hiện đã nằm trong một mảng. Bây giờ, bất kể có một hay nhiều sinh viên, bạn có thể truy xuất các sự kiện đó từ một mảng JSON trong mã của mình bằng cách sử dụng JSONPath sau: $.teachers.teacher.studentnames.name[0]

Phần tử <Path> cũng có thuộc tính unwrap, được giải thích bằng phần tiếp theo.

Mặc định NA
Sự hiện diện Không bắt buộc
Loại Chuỗi

Thuộc tính

 <Options>
    <TreatAsArray>
        <Path unwrap="true">teachers/teacher/studentnames/name</Path>
    </TreatAsArray>
</Options>
Thuộc tính Mô tả Sự hiện diện Loại
mở gói

Mặc định: false

Xoá phần tử khỏi dữ liệu đầu ra JSON. Sử dụng cách này để tinh giản hoặc làm phẳng ("unwrap") JSON cũng giúp rút ngắn JSONPath cần thiết để truy xuất các giá trị. Ví dụ: thay vì $.teachers.teacher.studentnames.name[*], bạn có thể làm phẳng JSON và sử dụng $.teachers.studentnames[*].

Dưới đây là ví dụ về JSON:

{
  "teachers" : {
      "teacher" : {
          "name" : "teacherA",
          "studentnames" : {
              "name" : [
                 "student1",
                 "student2"
              ]}...

Trong ví dụ này, bạn có thể lập luận rằng phần tử teacher và phần tử name của tên sinh viên là không cần thiết. Để bạn có thể xoá hoặc khám phá chúng. Dưới đây là cách bạn sẽ định cấu hình phần tử <Path> để thực hiện việc này:

<TreatAsArray>
    <Path unwrap="true">teachers/teacher</Path>
    <Path unwrap="true">teachers/teacher/studentnames/name</Path>
</TreatAsArray>

Thuộc tính unwrap được đặt thành true và đường dẫn đến các phần tử đến tính năng khám phá được cung cấp. Dữ liệu đầu ra JSON giờ đây sẽ có dạng như sau:

{
  "teachers" : [{
      "name" : "teacherA",
      "studentnames" : ["student1","student2"]
      }]...

Xin lưu ý rằng vì phần tử <Path> nằm trong <TreatAsArray>, cả hai phần tử trong Đường dẫn đều sẽ là được coi là các mảng trong dữ liệu đầu ra JSON.

Không bắt buộc Boolean

Để xem thêm ví dụ và hướng dẫn từng bước về tính năng, hãy xem bài viết này trên Cộng đồng Apigee: https://community.apigee.com/content/kbentry/33374/new-edge-minifeature-the-treatasarray-option-in-th.html.

&lt;Format&gt;

Định dạng giúp bạn kiểm soát quá trình chuyển đổi từ XML sang JSON. Nhập tên của trạng thái được xác định trước mẫu chứa một tổ hợp cụ thể các phần tử Lựa chọn được mô tả trong chủ đề này. Các định dạng được xác định trước bao gồm: xml.com, yahoo, google, badgerFish.

Sử dụng phần tử <Format> hoặc nhóm <Options>. Bạn không thể sử dụng cả <Format><Options>.

Sau đây là các định nghĩa về Định dạng của từng mẫu được xác định trước.

xml.com

<RecognizeNull>true</RecognizeNull>
<TextNodeName>#text</TextNodeName>
<AttributePrefix>@</AttributePrefix>

yahoo

<RecognizeNumber>true</RecognizeNumber>
<TextNodeName>content</TextNodeName>

google

<TextNodeName>$t</TextNodeName>
<NamespaceSeparator>$</NamespaceSeparator>
<TextAlwaysAsProperty>true</TextAlwaysAsProperty>

badgerFish

<TextNodeName>$</TextNodeName>
<TextAlwaysAsProperty>true</TextAlwaysAsProperty>
<AttributePrefix>@</AttributePrefix>
<NamespaceSeparator>:</NamespaceSeparator>
<NamespaceBlockName>@xmlns</NamespaceBlockName>
<DefaultNamespaceNodeName>$</DefaultNamespaceNodeName>

Cú pháp phần tử:

<Format>yahoo</Format>
Mặc định Nhập tên của một định dạng có sẵn:
xml.com, yahoo, google, badgerFish
Sự hiện diện Bắt buộc nếu bạn không dùng <Options>.
Loại Chuỗi

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.xmltojson.ExecutionFailed 500 Lỗi này xảy ra khi tải trọng đầu vào (XML) bị trống hoặc XML đầu vào không hợp lệ hoặc không đúng định dạng.
steps.xmltojson.InCompatibleType 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. Loại biến là bắt buộc có trong phần tử <Source> và phần tử <OutputVariable> phù hợp.
steps.xmltojson.InvalidSourceType 500 Lỗi này xảy ra nếu loại biến dùng để xác định phần tử <Source> là không hợp lệ.Các loại biến hợp lệ là thông báo và chuỗi.
steps.xmltojson.OutputVariableIsNotAvailable 500 Lỗi này xảy ra nếu biến được chỉ định trong phần tử <Source> của XML để Chính sách JSON thuộc loại chuỗi và phần tử <OutputVariable> chưa đượ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.xmltojson.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 XML sang JSON 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

Những lỗi này có thể xảy ra khi bạn triển khai proxy có chứa chính sách này.

Tên lỗi Nguyên nhân Khắc phục
EitherOptionOrFormat Nếu một trong các phần tử <Options> hoặc <Format> không đã khai báo trong Chính sách XML sang JSON thì không triển khai proxy API được.
UnknownFormat Nếu phần tử <Format> trong chính sách XML sang JSON có một giá trị không xác định xác định thì việc triển khai proxy API không thành công. Các định dạng được xác định trước bao gồm: xml.com, yahoo, googlebadgerFish.

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 = "SourceUnavailable"
xmltojson.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. xmltojson.XMLtoJSON-1.failed = true

Ví dụ về phản hồi khi gặp lỗi

{
  "fault": {
    "faultstring": "XMLToJSON[XMLtoJSON-1]: Source xyz is not available",
    "detail": {
      "errorcode": "steps.xml2json.SourceUnavailable"
    }
  }
}

Ví dụ về quy tắc lỗi

<faultrule name="VariableOfNonMsgType"></faultrule><FaultRule name="XML to JSON Faults">
    <Step>
        <Name>AM-SourceUnavailableMessage</Name>
        <Condition>(fault.name Matches "SourceUnavailable") </Condition>
    </Step>
    <Step>
        <Name>AM-BadXML</Name>
        <Condition>(fault.name = "ExecutionFailed")</Condition>
    </Step>
    <Condition>(xmltojson.XMLtoJSON-1.failed = true) </Condition>
</FaultRule>

Chủ đề có liên quan

JSON sang XML: JSON sang XML chính sách của Google