首页 > 解决方案 > 将 XML 转换为 JSON 和 Vice Versa,以及如何在发出 XML 请求时识别 REST 端点?

问题描述

在发布这个问题之前我做了很多研究,但是我没有得到适当的指导。我的公司通过Proxy/Gateway. 大约 1000 名客户注册到代理/网关并向基于 SOAP 的系统发出 XML 请求(部署在WebSphere App Server (WAS) V7.5上)。现在,我们开发了仅支持 JSON 的新系统,并希望指向部署在 PCF(Pivotal Cloud Foundry)上的新开发系统。

在这里我们不想要求消费者做任何改变。

现在,我们正在尝试开发Adapter (Spring Boot Project)将 XML 请求转换为 JSON 向新系统发出请求并以 JSON 格式获取响应并再次Adapter (Spring Boot Project)将 JSON 转换为 XML 的开发。在这里,JSON 响应和 XML 响应有时可能不同。

现在,我真的无法决定调用哪个端点

String xml_data = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:urn=\"urn:ahc.com:dms:wsdls:organization\">\n" + 
        "   <soapenv:Header/>\n" + 
        "   <soapenv:Body>\n" + 
        "      <urn:getRoles>\n" + 
        "         <getRolesRequest>\n" + 
        "            <Type>ABC</Type>\n" + 
        "         </getRolesRequest>\n" + 
        "      </urn:getRoles>\n" + 
        "   </soapenv:Body>\n" + 
        "</soapenv:Envelope>";
JSONObject obj = XML.toJSONObject(xml_data);
System.out.println(obj);

它给了我以下回应。

{"soapenv:Envelope":{"soapenv:Body":{"urn:getRoles":{"getRolesRequest":{"Type":"AYU"}}},"xmlns:soapenv":"http://schemas.xmlsoap.org/soap/envelope/","xmlns:urn":"urn:ahc.com:dms:wsdls:organization","soapenv:Header":""}}

有什么指导吗?

注意:我想<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\从 JSON 对象中删除。此外,在将 JSON 转换为 XML 时,我想添加<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\

标签: javajsonxmlspring-boot

解决方案


您可以使用underscore-java库。它具有读取 xml 和生成 json 的静态方法。

    String xmlData = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\""
    + " xmlns:urn=\"urn:ahc.com:dms:wsdls:organization\">\n"
    + "   <soapenv:Header/>\n"
    + "   <soapenv:Body>\n"
    + "      <urn:getRoles>\n"
    + "         <getRolesRequest>\n"
    + "            <Type>ABC</Type>\n"
    + "         </getRolesRequest>\n"
    + "      </urn:getRoles>\n"
    + "   </soapenv:Body>\n"
    + "</soapenv:Envelope>";
    Map<String, Object> jsonData = U.<Map<String, Object>>get(
        U.<Map<String, Object>>fromXmlWithoutNamespaces(xmlData), "Envelope.Body.getRoles");
    System.out.println(U.toJson(jsonData));

输出:

{
  "getRolesRequest": {
    "Type": "ABC"
  }
}

推荐阅读