代码之家  ›  专栏  ›  技术社区  ›  Mr.D

WSO2 EI,遍历JSON数组

  •  2
  • Mr.D  · 技术社区  · 9 年前

    {
        "array": ["Hello", "this", "is", "an", "arrray", "1", 3, 4]
    }
    

    我想迭代数组中的每个元素,并在日志中显示它们。

    我为它创建了这样的序列:

    <?xml version="1.0" encoding="UTF-8"?>
    <sequence name="for_each_test_seq_in" trace="enable" xmlns="http://ws.apache.org/ns/synapse">
        <property expression="json-eval($.array)" name="array"
        scope="default" type="STRING" xmlns:ns="http://org.apache.synapse/xsd"/>
        <log level="full">
            <property expression="get-property('array')" name="ARRAY" xmlns:ns="http://org.apache.synapse/xsd"/>
        </log>
        <iterate expression="get-property('array')" id="iterate_one" xmlns:ns="http://org.apache.synapse/xsd">
            <target sequence="anon">
                <sequence>
                    <log level="full"/>
                </sequence>
            </target>
        </iterate>
        <respond/>
    </sequence>
    

    [2017-09-19 16:06:40,236] [] ERROR - SynapseXPath Evaluation of the XPath expression get-property('array') resulted in an error
    org.jaxen.UnresolvableException: No Such Function get-property
        at 
    org.jaxen.SimpleFunctionContext.getFunction(SimpleFunctionContext.java:127)
        at org.jaxen.ContextSupport.getFunction(ContextSupport.java:242)
        at org.jaxen.Context.getFunction(Context.java:216)
        ...
    

    我不明白为什么 get-property 这是未知的。我知道 获取属性

    我只想迭代 array 元素并对其进行处理。

    有可能吗?

    1 回复  |  直到 4 年前
        1
  •  0
  •   simar    9 年前

    以下是实现。

    rest服务的WSO API。接收请求,记录消息体,按顺序处理并发送回客户端。序列 不更改消息内容

    <?xml version="1.0" encoding="UTF-8"?>
    <api context="/array" name="array" xmlns="http://ws.apache.org/ns/synapse">
        <resource methods="POST">
            <inSequence>
                <log>
                    <property expression="json-eval($.*)" name="==============="/>
                </log>
                <sequence key="for_each_test_seq_in"/>
                <loopback/>
            </inSequence>
            <outSequence>
                <send/>
            </outSequence>
            <faultSequence/>
        </resource>
    </api>
    

    这是序列码

    <?xml version="1.0" encoding="UTF-8"?>
    <sequence name="for_each_test_seq_in" trace="disable" xmlns="http://ws.apache.org/ns/synapse">
        <property expression="json-eval($.array)" name="array" scope="default" type="STRING"/>
        <log level="full">
            <property expression="get-property('array')" name="ARRAY" xmlns:ns="http://org.apache.synapse/xsd"/>
        </log>
        <foreach expression="//array">
            <sequence>
                <log level="full"/>
            </sequence>
        </foreach>
    </sequence>
    

    SoapUI request response

    服务器状态日志

    [2017-10-16 23:55:18,375] [EI-Core]  INFO - LogMediator To: /array, MessageID: urn:uuid:648f7e51-4c71-48d7-8d09-f914ce29a867, Direction: request, =============== = [[34,234,"example",56.3,"mom"]]
    [2017-10-16 23:55:18,379] [EI-Core]  INFO - LogMediator To: /array, MessageID: urn:uuid:648f7e51-4c71-48d7-8d09-f914ce29a867, Direction: request, ARRAY = [34,234,"example",56.3,"mom"], Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><jsonObject><array>34</array><array>234</array><array>example</array><array>56.3</array><array>mom</array></jsonObject></soapenv:Body></soapenv:Envelope>
    [2017-10-16 23:55:18,380] [EI-Core]  INFO - LogMediator To: /array, MessageID: urn:uuid:648f7e51-4c71-48d7-8d09-f914ce29a867, Direction: request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><array>34</array></soapenv:Body></soapenv:Envelope>
    [2017-10-16 23:55:18,381] [EI-Core]  INFO - LogMediator To: /array, MessageID: urn:uuid:648f7e51-4c71-48d7-8d09-f914ce29a867, Direction: request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><array>234</array></soapenv:Body></soapenv:Envelope>
    [2017-10-16 23:55:18,381] [EI-Core]  INFO - LogMediator To: /array, MessageID: urn:uuid:648f7e51-4c71-48d7-8d09-f914ce29a867, Direction: request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><array>example</array></soapenv:Body></soapenv:Envelope>
    [2017-10-16 23:55:18,381] [EI-Core]  INFO - LogMediator To: /array, MessageID: urn:uuid:648f7e51-4c71-48d7-8d09-f914ce29a867, Direction: request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><array>56.3</array></soapenv:Body></soapenv:Envelope>
    [2017-10-16 23:55:18,382] [EI-Core]  INFO - LogMediator To: /array, MessageID: urn:uuid:648f7e51-4c71-48d7-8d09-f914ce29a867, Direction: request, Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><array>mom</array></soapenv:Body></soapenv:Envelope>
    

    第一行由

    <log><property expression="json-eval($.*)" name="==============="/></log>
     ...=============== = [[34,234,"example",56.3,"mom"]]
    

    第二行日志是序列中部分代码的结果

    <log level="full">
        <property expression="get-property('array')" name="ARRAY"/>
    </log>
      ....Direction: request, ARRAY = [34,234,"example",56.3,"mom"], Envelope: <?xml version='1.0' encoding='utf-8'?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><jsonObject><array>34</array><array>234</array><array>example</array><array>56.3</array><array>mom</array></jsonObject></soapenv:Body></soapenv:Envelope>
    

    如你所见,它有两种表示。一种是json格式:

    ARRAY = [34,234,"example",56.3,"mom"]
    

    https://docs.wso2.com/display/ESB500/JSON+Support JSON有效负载的XML表示 )

    <?xml version='1.0' encoding='utf-8'?>
       <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
               <soapenv:Body>
                   <jsonObject>
                       <array>34</array>
                       <array>234</array>
                       <array>example</array>
                       <array>56.3</array>
                       <array>mom</array>
               </jsonObject>
        </soapenv:Body>
    </soapenv:Envelope>
    

    文档表明,如果考虑xml中的json表示,可以在json负载上应用xpath。使用这个函数只需应用于每个函数,就可以使用xpath获得数组的每个部分

    结果,在xml表示中,原始数组由数组的每个元素表示并记录在控制台中。你可以在其余的日志中看到它

    LogMediator To: /array, MessageID: urn:uuid:6...  Envelope: <soapenv:Body><array>34</array></soapenv:Body>
    LogMediator To: /array, MessageID: urn:uuid:6.... Envelope: <soapenv:Body><array>234</array></soapenv:Body>
    LogMediator To: /array, MessageID: urn:uuid:6...  Envelope: <soapenv:Body><array>example</array></soapenv:Body>
    LogMediator To: /array, MessageID: urn:uuid:6.... Envelope: <soapenv:Body><array>56.3</array></soapenv:Body>
    LogMediator To: /array, MessageID: urn:uuid:6.... Envelope: <soapenv:Body><array>mom</array></soapenv:Body>