WSO2 EI,遍历 JSON 数组
WSO2 EI, Iterate through JSON Array
我正在通过 WSO2 EI 创建简单的 REST API。我要发送这个 json:
{
"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
不为人所知。我知道 get-property
是一个 XPath 函数。
我只想遍历 array
元素的每个元素并对它们做一些事情。
可能吗?
这里是实现。
WSO API 休息服务。接收请求,记录消息正文,按顺序处理并发送回客户端。序列for_each_test_seq_in不改变消息内容
<?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>
下面图片中post请求的示例
服务器状态日志
[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(第 XML 章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 //array
获取数组的每个部分
结果原始数组,在 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>
我正在通过 WSO2 EI 创建简单的 REST API。我要发送这个 json:
{
"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
不为人所知。我知道 get-property
是一个 XPath 函数。
我只想遍历 array
元素的每个元素并对它们做一些事情。
可能吗?
这里是实现。
WSO API 休息服务。接收请求,记录消息正文,按顺序处理并发送回客户端。序列for_each_test_seq_in不改变消息内容
<?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>
下面图片中post请求的示例
服务器状态日志
[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(第 XML 章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 //array
获取数组的每个部分结果原始数组,在 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>