Webservice优化,使用mule中json/xml的转换功能

本文是在上一篇文章的基础上进行优化和测试的,mule的基础可以看上一篇文章《Mule通过HTTP连接并传参给webService》https://blog.csdn.net/dl348/article/details/83185036

描述:前端页面需要json数据,但是后端的webservice传输方式是要xml。所以要在mule中进行数据转换。在经过上文的测试调通后,再进一步进行优化。

json转xml

尝试了两种json的工具,org.json和json-lib 。两种转换工具都有缺陷,是否有缺陷的验证方法很简单,json->xml->json后,前后json一致。xml->json->xml后,前后xml一致则表示该工具ok。但是两者都不通过此验证。小结如下:

org.json的依赖比较少,但是不能区分xml的标签属性,因此会把标签属性和标签内容文字以相同的方式转化为json。

json-lib的依赖比较多,可以区分xml的标签属性,对于有xml的标签属性,转成json时会在key前面添加 - 以示标识。但是转化不完整,如果是多个标签嵌套,有时会省略掉中间的标签。并且在转换时,如果遇到无内容的标签,转出来的json格式变成[],而非null。

 

最后决定尝试mule自带的json、xml转换功能。测试的结果,完美!

流程图如下:

Webservice优化,使用mule中json/xml的转换功能_第1张图片

使用JSON TO XML有一个需要注意的地方,传入的json要符合xml的格式要求。xml是必须要有根标签的。举个例子:

{"name":"Mary","sex":"F"},这个json是转不了xml的,因为没有根标签。

{“person”:{"name":"Mary","sex":"F"}},这个是可以转xml的,转出来的值如下:MaryF

http传入json,经过 “JSON TO XML",传到Java的message的payload已经是XML格式了。此时可以通过dom4j进行xml的解释,并组成你需要的map。最后把map转换成soap的xml,返回该xml给webservice。

Webservice优化,使用mule中json/xml的转换功能_第2张图片

当webservice接收参数并且返回内容时,先到接收的java中,提取return标签的内容。注意,此时的payload并不是String类型,而是DepthXMLStreamReader类型。对于此类型,可以通过截图方式进行解释。也可以通过message.getPayloadAsString()的方式获取String,然后解析String,或者把String转成xml,用dom4j解析。

需要注意的是,经过测试发现message.getPayloadAsString(),不仅仅是返回payload的String格式内容,还会对payload进行改动,导致DepthXMLStreamReader的方式失效。如下图所示,如果开启20-25行的代码,37行就会报错。

Webservice优化,使用mule中json/xml的转换功能_第3张图片

 

这里再贴一下parseMapToSoapXml的代码:

public static String mapToSoapXml(Map map,String method,String nameSpace) {
		if(map!=null){
			JSONObject json = JSONObject.fromObject(map);
			XMLSerializer ser= new XMLSerializer();
			ser.setRootName("tem:"+method);
					ser.write(json);
					ser.setNamespace("tem", nameSpace);
					ser.setTypeHintsEnabled(false);
			String result = ser.write(json,"UTF-8");
			System.out.println("xml====================="+result);
			return result;
		}else{
			
			return null;
		}
	
	}

你可能感兴趣的:(ESB)