Web Services 在java中从soap响应创建json

cwtwac6a  于 2022-11-15  发布在  Java
关注(0)|答案(3)|浏览(250)

我有一个REST Web服务,它反过来调用一个Soap请求。我想把soap响应转换成json,这样它就可以作为输出返回给REST服务。实现这一点最有效的方法是什么?
为了详细说明这个问题,假设我得到了一个Soap xml响应,如下所示。

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope/" soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding">
    <soap:Body xmlns:m="http://www.example.org/stock">
        <m:GetStockPriceResponse>
            <m:Price>344.5</m:Price>
        </m:GetStockPriceResponse>
    </soap:Body>
</soap:Envelope>

我希望json是这样的
{【产品价格】:【344.5元】}
我已经尝试了org.json.XML.toJSONObject()方法,但是它没有给予我所期望的输出。

5lwkijsr

5lwkijsr1#

您是否尝试过:

public String XMLtoJSON(String xml) {
    JSONObject jsonObj = XML.toJSONObject(xml);
    String json = jsonObj.toString();
    return json;
}
kb5ga3dv

kb5ga3dv2#

如果您使用的是Java 8或更高版本,您应该查看我的开源库:unXml基本上从XPathMap到JSON属性。
可在Maven Central上找到。

  • 范例 *
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.nerdforge.unxml.factory.ParsingFactory;
import com.nerdforge.unxml.parsers.Parser;
import org.w3c.dom.Document;

public class Parser {
  public ObjectNode parseXml(String xml){
    Parsing parsing = ParsingFactory.getInstance(namespaces()).create();
    Document document = parsing.xml().document(xml);

    Parser<ObjectNode> parser = parsing.obj("//m:GetStockPriceResponse")
        .attribute("price", "m:Price", parsing.number())
        .build();

    ObjectNode result = parser.apply(document);
    return result;
  }

  private Map<String, String> namespaces(){
    return new HashMap<String, String>(){{
        put("m", "http://www.example.org/stock");
    }};
  }
}

它将返回一个JacksonObjectNode,其中包含以下json:

{"price":344.5}
ymzxtsji

ymzxtsji3#

我假设您已经使用了Jakarta XML Web ServicesJakarta XML Binding。带jakarta.ws.WebService注解的类将Java对象隐式地转换为XML,并将其转换为带jakarta.ws.WebMethod注解的方法,并返回Java bean的示例。您只需将这些示例传递给Jakarta JSON Binding即可:

import jakarta.ejb.Stateless;
import jakarta.jws.WebMethod;
import jakarta.jws.WebParam;
import jakarta.jws.WebService;
import jakarta.json.bind.Jsonb;
import jakarta.json.bind.JsonbBuilder;

@Stateless
@WebService
public class Manager {

    @WebMethod(operationName = "getMyJavaBeanAsJson")
    public String getMyJavaBeanAsJson(@WebParam(name = "id") final BigDecimal id) {
        final MyJavaBean myJavaBeanInstance = MyJavaBeanService.getInstance().find(id);
        try (final Jsonb jsonb = JsonbBuilder.create()) {
            return jsonb.toJson(myJavaBeanInstance);
        }
    }
}

请注意,我的答案只使用标准的Jakarta EE(〉= 9)API,没有第三方依赖项。
另一个解决方案是使用Java Stax(用于XML处理的Java API)读取SOAP信封、SOAP主体、SOAP响应、SOAP返回,然后只将接收到的XML的这一部分转换为JSON。要么将XML转换为Java Bean并使用上面的解决方案转换为JSON,要么不使用Java Bean将XML转换为JSON。依我的拙见,如果不想在JSON中返回SOAP内容,可以使用Stax只获取SOAP返回,并将其传递给org.json.XML.toJSONObject(final String xml)或任何其他能够将XML转换为JSON的工具。

相关问题