WSO2 ESB От XML (несколько строк) до JSON (без упаковщиков) - PullRequest
0 голосов
/ 15 мая 2018

Я надеюсь найти помощь здесь ... Вот частный случай: Я получаю этот XML из моей конечной точки:

<Entries>
    <Entry>
        <Customer>1</Customer>
    </Entry>
    <Entry>
        <Customer>2</Customer>
    </Entry>
<Entries>

Я могу легко преобразовать этот XML в JSON, изменив Свойство messageType, что приведет к:

{"Entries":{"Entry":[{"Customer": 1}, {"Customer": 2}]}}

Вот что я хочу получить в виде JSON (без упаковщиков):

[{"Customer": 1}, {"Customer": 2}]

Есть кто-то, кто знает, как?
Большое спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Спасибо, Ануруддха и Николас!
Ваши ответы вдохновили меня, и я хочу поделиться тем, что я сделал.

Я создал эту последовательность, которую я повторно использую с посредником Последовательности:

<sequence name="toJSON" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
    <property name="messageType" scope="axis2" type="STRING" value="application/json"/>
    <property name="result" scope="default" type="STRING" expression="json-eval($.Entries.Entry)"/>
    <payloadFactory media-type="json">
        <format>$1</format>
        <args>
            <arg evaluator="xml" expression="$ctx:result"/>
        </args>
    </payloadFactory>
</sequence>

Это работает так хорошо, что я даже изменил последовательность всех моих Прокси, даже тех, которые возвращают только 1 результат.

Большое спасибо за ваши огни!

0 голосов
/ 15 мая 2018

Я думаю, что сначала вы должны манипулировать вашим XML (возможно, с помощью посредника xslt), чтобы отформатировать его таким образом

<jsonArray>
    <Customer>1</Customer>
    <Customer>2</Customer>
</jsonArray>

Тогда, я думаю, вы получите ожидаемый результат.

Например, следующий xslt может выполнить работу

<xsl:stylesheet exclude-result-prefixes="xsl" version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output encoding="utf-8" indent="yes" method="xml" omit-xml-declaration="yes"/>     
    <xsl:template match="/Entries">
        <xsl:element name="jsonArray">
            <xsl:copy-of select="./Entry/Customer" />
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>
...