用asp做网站课程,湘潭网站优化公司,学院网站建设项目,域名备案做电影网站在我们的开发过程中#xff0c;接口响应一般都是使用的JSON格式#xff1b;随着我们接入的系统的增加#xff0c;以及开发需求的增加#xff0c;不乏出现一些使用XML解析的系统#xff0c;需要我们将response内容转换成XML的格式响应#xff0c;那么我们需要对此重新写个…在我们的开发过程中接口响应一般都是使用的JSON格式随着我们接入的系统的增加以及开发需求的增加不乏出现一些使用XML解析的系统需要我们将response内容转换成XML的格式响应那么我们需要对此重新写个接口吗
当然不我们可以通过增加yml配置的形式或者通过在接口上增加Type的方式进行XML格式的转换那么接下来我们要讨论的便是如何转换XML
我这边能提供的有俩种方式一种是比较简单直接的字符串拼接的方式 /*** 构建XML响应* 方式一简单粗暴直接使用字符串拼接** param value* param request* return*/public String buildResponseXML(Object value, Map response) {StringBuilder xmlBuilder new StringBuilder();try {String str ?xml version\1.0\ encoding\UTF-8\?;xmlBuilder.append().append(str).append().append(\n);buildXmlFromMap(response, xmlBuilder);} catch (Exception e) {}return xmlBuilder.toString().trim();}/*** 构建xml方法将map集合构建成XML格式** param map* param xmlBuilder*/private static void buildXmlFromMap(MapString, Object map, StringBuilder xmlBuilder) {for (Map.EntryString, Object entry : map.entrySet()) {String key entry.getKey();Object value entry.getValue();if (value instanceof Map) {// 如果值是一个 Map递归处理xmlBuilder.append().append(key).append();buildXmlFromMap((MapString, Object) value, xmlBuilder);xmlBuilder.append(/).append(key).append();} else {// 普通键值对xmlBuilder.append().append(key).append().append(value null ? : escapeXml(value.toString())).append(/).append(key).append();}}}/*** 将XML中的特殊字符转义** param value* return*/private static String escapeXml(String value) {return value.replace(, amp;).replace(, lt;).replace(, gt;).replace(\, quot;).replace(, apos;);}
这种方式比较简单直接就是将response的内容通过entrySet循环key作为xml的标签value作为标签中的值使用append直接输出
另一种是通过XML实现类直接进行转换这种对于复杂一点的项目效果比较好 /*** 构建XML响应* 方式二Document构建xml后Transformer转写** return* throws Exception*/public String buildXmlResponse(Map xmlMap) {try {// 创建 DocumentBuilderDocumentBuilderFactory factory DocumentBuilderFactory.newInstance();DocumentBuilder builder factory.newDocumentBuilder();// 创建 Document 对象代表整个 XML 文档Document document builder.newDocument();// 生成XML节点addNodesFromMap(document, null, xmlMap);// 转换 Document 为字符串return convertDocumentToString(document);} catch (Exception e) {throw ExceptionUtils.create(ErrorCodeEnum.SCIM_RESPONSE_IS_FAILED);}}/*** 公共方法从 Map 生成 XML 节点** param document Document 对象* param parent 父节点或根节点* param map Map 数据*/private void addNodesFromMap(Document document, Element parent, MapString, Object map) {for (Map.EntryString, Object entry : map.entrySet()) {String key entry.getKey();Object value entry.getValue();// 创建当前节点Element child document.createElement(key);// 处理value值if (value instanceof Map) {// 如果值是 Map递归创建子节点addNodesFromMap(document, child, (MapString, Object) value);} else if (value instanceof List) {child document.createElement(key);// 如果值是 List处理列表内容handleList(document, child, key, (ListObject) value);} else if (value instanceof HashSet) {List list new ArrayList((HashSet) value);child document.createElement(key);// 如果值是 List处理列表内容handleList(document, child, key, (ListObject) list);} else {// 如果值是普通对象直接设置文本内容child.appendChild(document.createTextNode(value ! null ? value.toString() : null));}// 判断是否存在父节点如果没有父节点说明是根节点if (parent null) {document.appendChild(child);} else {// 将子节点附加到父节点parent.appendChild(child);}}}/*** 处理 List 类型的值** param document Document 对象* param parent 父节点* param key 当前标签名* param list List 数据*/private void handleList(Document document, Element parent, String key, ListObject list) {
// logger.info(当前List转换标签Key key);if (CollectionUtils.isEmptyCollection(list)) {return;}// 遍历list值for (Object item : list) {if (item instanceof String || item instanceof Number || item instanceof Boolean) {// 如果是简单类型直接创建子节点Element child document.createElement(key); // 子节点名称与 List 的 key 保持一致child.appendChild(document.createTextNode(item.toString()));parent.appendChild(child);} else if (item instanceof Map) {// 如果是 Map递归处理Element child document.createElement(key); // 子节点名称与 List 的 key 保持一致addNodesFromMap(document, child, (MapString, Object) item);parent.appendChild(child);}}}/*** 将 Document 对象转换为 XML 格式写出** param document* return* throws Exception*/private static String convertDocumentToString(Document document) throws Exception {// 使用 Transformer 将 Document 转换为字符串TransformerFactory factory TransformerFactory.newInstance();Transformer transformer factory.newTransformer();DOMSource domSource new DOMSource(document);StringWriter writer new StringWriter();StreamResult result new StreamResult(writer);transformer.transform(domSource, result);return writer.toString();}
以上就是response的JSON转为XML格式的方法