我有一个情况,我们接受'JSON'样的代码到API中,有一个情况的问题,其中一个客户有一个数字ID作为字段名。
。
{
"Node1": {
"123456": [
{
"Field1": "Value1",
"Field2": "Value2"
},
{
"Field1": "Value3",
"Field2": "Value4"
}
]
}
}
现在,如果我硬编码123456
,尝试将数组设置为属性工作<property name="fields" expression="json-eval($.Node1.123456)" scope="default" type="STRING"></property>
但是我需要动态地设置这个表达式。我有一个对所讨论的id的引用作为属性值。
是否可以动态构建一个表达式,以便我可以将此json设置为属性?
ie。就像
<property name="myid" value="123456"/>
<property name="fields" expression="fn:concat('json-eval($.Node1.', get-property('myid'))" scope="default" type="STRING"></property>
是否可以将消息转换为XML并以某种方式引用它并转换回json?
谢谢!
可以使用属性中介和脚本中介。
下面是一个例子:
<property name="payload" expression="json-eval($.)"/>
<property name="myid" value="123456"/>
<property name="HARDCODED" value="none"/>
<script language="js">
var myid = mc.getProperty("myid");
// you can interate your payload if needed
var payload = mc.getProperty("payload");
// Or just make a String of it
var json = '{ "Node1" : { "' + myid + '": [{ "Field1": "Value1", "Field2": "Value2" }] } }';
mc.setProperty("HARDCODED", json);
</script>
<payloadFactory media-type="json">
<format>$1</format>
<args>
<arg evaluator="xml" expression="get-property('HARDCODED')"/>
</args>
</payloadFactory>
使用JavaScript,你可以直接进入它。
希望能有所帮助。
我可以通过迂回的方式做到这一点。我必须在消息到达后使用我自己的Mediator修改消息。
在下面的代码中,我只是以第一次出现为例
public class MyMediator extends AbstractMediator {
.
.
public boolean mediate(MessageContext mc) {
OMFactory factory = OMAbstractFactory.getOMFactory();
SOAPBody b = mc.getEnvelope().getBody();
Iterator it = b.getFirstElement().getChildrenWithLocalName("Node1");
if(it.hasNext()){
OMElement obj = (OMElement)it.next();
Iterator w_it = obj.getChildElements();
if(w_it.hasNext()){
OMElement cfield = (OMElement)w_it.next();
cfield.setLocalName("Order");
.
.
}
((OMContainerEx)b).setFirstChild(obj);
}
}
.
.
}
然后我可以获取id并使用id创建一个新的OMElement,并将元素重命名为有意义的东西,如'Order'
现在我可以使用json路径引用它并将其设置为属性如:
<property name="fields" expression="json-eval($.Order)" scope="default" type="STRING"></property>
在我的例子中,id也在Order的字段中。所以这对我来说不是问题,但是如果您需要,当您重命名节点时,您可以存储现有的名称(即。通过创建新的OMElement并将其添加到obj
,将12345)作为值。的'((OMContainerEx)b).setFirstChild(obj);'是可选的。我不关心前面的路径,所以把它们删掉了。
希望这篇文章能帮助到一些人(或者有人能想出一个更好的主意;))