我正在使用WSO2 ESB并尝试将我的XML有效负载转换为Json。
<property name="messageType" value="application/json" scope="axis2"/>
上面的属性介体将我的xml转换为json,一切正常。
问题在于我的XML有效负载中的子节点。
当xml是
时<users>
<user>user1</user>
<user>user2</user>
</users>
它会转换为
"users": {
"user": [
"user1", "user2"
]
}
所以我的休息完整端点收到json有效负载,期望列表'用户'工作正常。
但是当xml是
时<users>
<user>user1</user>
</users>
转换后的json看起来像这样,
"users": {
"user": "user1"
}
因此,期望“用户”列表的restfull端点没有得到列表,而是发送了一个字符串,并且数据类型不匹配导致找不到端点。
如果进一步尝试,
<Data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:json="http://james.newtonking.com/projects/json">
<users>
<user json:Array="true">user1</user>
</users>
</Data>
这个转换器给出了一个json,
{
"Data": {
"users": {
"user": {
"@Array": "true",
"$": "user1"
}
}
}
}
我需要的是,
{
"Data": {
"users": {
"user": {
[
"user1"
]
}
}
}
}
杰伊的建议之后,
谢谢Jay,
在您输入之后,我尝试了一些东西,但我在某个时候陷入困境。这就是我想要的,
mc.setPayloadJSON(
{
"someIds" : {
"someIdList" : (vUIdLen > 1 ? mc.getProperty("someIdList") : "["+someIdList+"]")
}
});</script>
我正在检查子节点的长度,如果它大于1,那么我正在使用该节点的早期捕获值[“abc”,“pqr”]并且它是否小于或= 1我正在使用单个json值并在“[”+ someIdList +“]”中构建它,但它们中的任何一个都没有被追加。它给出了错误“脚本引擎返回执行内联js脚本函数调解的错误”。
如何正确追加。
(vUIdLen > 1 ? mc.getProperty("someIdList") : "["+someIdList+"]")
上面的mc.getProperty(“someIdList”)的值是[“abc”,“pqr”],“[”+ someIdList +“]”中someIdList的值是abc。
请建议。
答案 0 :(得分:3)
如果不使用脚本中介,还有另一种解决方案,您可以添加
<?xml-multiple?>
处理有效负载的指令。如下;
<users>
<?xml-multiple?>
<user>user1</user>
</users>
这将为用户创建json数组。
{"users": {"user": ["user1"]}}
希望这会有所帮助。
答案 1 :(得分:1)
使用脚本调解器来构建有效负载。请参阅以下链接。
答案 2 :(得分:0)
如果有人希望将XML转换为Json,则可以使用以下方法。它将所有JSONObject封闭在JSONArray中。
public JSONObject getJSONFromXML(String xml) {
JSONObject jsonObject = null;
try {
jsonObject = XML.toJSONObject(xml);
convertJsonObjectToArray(jsonObject);
} catch (JSONException e) {
System.out.println("Error in parsing JSON From xml: " + e);
}
return jsonObject;
}
private void convertJsonObjectToArray(JSONObject jsonObject) throws JSONException {
for (Object key : jsonObject.keySet()) {
Object val = jsonObject.get(key.toString());
if (val instanceof JSONObject) {
convertJsonObjectToArray((JSONObject) val);
JSONArray jsonArray = new JSONArray();
jsonArray.put(val);
jsonObject.put(key.toString(), jsonArray);
} else if (val instanceof JSONArray) {
JSONArray jsonArray = (JSONArray) val;
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject obj = (JSONObject) jsonArray.get(i);
convertJsonObjectToArray(obj);
}
}
}
}