如何将单个子xml元素转换为Json数组

时间:2016-02-26 16:21:12

标签: java json xml wso2esb

我正在使用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 &gt; 1 ? mc.getProperty("someIdList") : "["+someIdList+"]")
                }
            });</script>

我正在检查子节点的长度,如果它大于1,那么我正在使用该节点的早期捕获值[“abc”,“pqr”]并且它是否小于或= 1我正在使用单个json值并在“[”+ someIdList +“]”中构建它,但它们中的任何一个都没有被追加。它给出了错误“脚本引擎返回执行内联js脚本函数调解的错误”。

如何正确追加。

(vUIdLen &gt; 1 ? mc.getProperty("someIdList") : "["+someIdList+"]")

上面的mc.getProperty(“someIdList”)的值是[“abc”,“pqr”],“[”+ someIdList +“]”中someIdList的值是abc。

请建议。

3 个答案:

答案 0 :(得分:3)

如果不使用脚本中介,还有另一种解决方案,您可以添加

<?xml-multiple?> 

处理有效负载的指令。如下;

<users>
    <?xml-multiple?>
    <user>user1</user>
</users>

这将为用户创建json数组。

{"users": {"user": ["user1"]}}

希望这会有所帮助。

答案 1 :(得分:1)

使用脚本调解器来构建有效负载。请参阅以下链接。

[1]。 https://docs.wso2.com/display/ESB480/Script+Mediator

[2]。 https://docs.wso2.com/display/ESB480/JSON+Support

答案 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);
            }
        }
    }
}