XML 和 JSON 相互转换, 包括 attribute。转换的时候将 XML 属性转换成JSON 的时候, 前面用 @ 特殊字符表示 XML 属性

import java.io.Reader;
import java.io.StringReader;import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.XML;
import org.json.XMLParserConfiguration;
import org.json.XMLTokener;
import org.json.XMLXsiTypeConverter;public class XMLJson extends XML {private static final String ATTR_PREFIX = "@";public static JSONObject toJSONObject(Reader reader, XMLParserConfiguration config) throws JSONException {JSONObject jo = new JSONObject();XMLTokener x = new XMLTokener(reader);while (x.more()) {x.skipPast("<");if(x.more()) {parse(x, jo, null, config);}}return jo;}public static JSONObject toJSONObject(String string) throws JSONException {return toJSONObject(string, XMLParserConfiguration.ORIGINAL);}public static JSONObject toJSONObject(String string, XMLParserConfiguration config) throws JSONException {return toJSONObject(new StringReader(string), config);}public static String toString(Object object) throws JSONException {return toString(object, null, XMLParserConfiguration.ORIGINAL);}public static String toString(final Object object, final String tagName) {return toString(object, tagName, XMLParserConfiguration.ORIGINAL);}/*** Convert a JSONObject into a well-formed, element-normal XML string.** @param object*            A JSONObject.* @param tagName*            The optional name of the enclosing tag.* @param config*            Configuration that can control output to XML.* @return A string.* @throws JSONException Thrown if there is an error parsing the string*/public static String toString(final Object object, final String tagName, final XMLParserConfiguration config)throws JSONException {StringBuilder sb = new StringBuilder();JSONArray ja;JSONObject jo;String string;if (object instanceof JSONObject) {// Emit <tagName>if (tagName != null) {sb.append('<');sb.append(tagName);sb.append('>');}int indexAttr = sb.length() - 1;// Loop thru the keys.// don't use the new entrySet accessor to maintain Android Supportjo = (JSONObject) object;for (final String key : jo.keySet()) {Object value = jo.opt(key);if (value == null) {value = "";} else if (value.getClass().isArray()) {value = new JSONArray(value);}// Emit content in bodyif (key.equals(config.getcDataTagName())) {if (value instanceof JSONArray) {ja = (JSONArray) value;int jaLength = ja.length();// don't use the new iterator API to maintain support for Androidfor (int i = 0; i < jaLength; i++) {if (i > 0) {sb.append('\n');}Object val = ja.opt(i);sb.append(escape(val.toString()));}} else {sb.append(escape(value.toString()));}// Emit an array of similar keys}else if(key.startsWith(ATTR_PREFIX)) {//set attributeStringBuilder ab = new StringBuilder(" ").append(key.substring(1)).append(EQ).append(QUOT).append(escape(value.toString())).append(QUOT);sb.insert(indexAttr, ab);indexAttr = indexAttr + ab.length();}else if (value instanceof JSONArray) {ja = (JSONArray) value;int jaLength = ja.length();// don't use the new iterator API to maintain support for Androidfor (int i = 0; i < jaLength; i++) {Object val = ja.opt(i);if (val instanceof JSONArray) {sb.append('<');sb.append(key);sb.append('>');sb.append(toString(val, null, config));sb.append("</");sb.append(key);sb.append('>');} else {sb.append(toString(val, key, config));}}} else if ("".equals(value)) {sb.append('<');sb.append(key);sb.append("/>");// Emit a new tag <k>} else {sb.append(toString(value, key, config));}}if (tagName != null) {// Emit the </tagName> close tagsb.append("</");sb.append(tagName);sb.append('>');}return sb.toString();}if (object != null && (object instanceof JSONArray ||  object.getClass().isArray())) {if(object.getClass().isArray()) {ja = new JSONArray(object);} else {ja = (JSONArray) object;}int jaLength = ja.length();// don't use the new iterator API to maintain support for Androidfor (int i = 0; i < jaLength; i++) {Object val = ja.opt(i);// XML does not have good support for arrays. If an array// appears in a place where XML is lacking, synthesize an// <array> element.sb.append(toString(val, tagName == null ? "array" : tagName, config));}return sb.toString();}string = (object == null) ? "null" : escape(object.toString());return (tagName == null) ? "\"" + string + "\"": (string.length() == 0) ? "<" + tagName + "/>" : "<" + tagName+ ">" + string + "</" + tagName + ">";}/*** Scan the content following the named tag, attaching it to the context.** @param x*            The XMLTokener containing the source string.* @param context*            The JSONObject that will include the new material.* @param name*            The tag name.* @return true if the close tag is processed.* @throws JSONException*/private static boolean parse(XMLTokener x, JSONObject context, String name, XMLParserConfiguration config)throws JSONException {char c;int i;JSONObject jsonObject = null;String string;String tagName;Object token;XMLXsiTypeConverter<?> xmlXsiTypeConverter;// Test for and skip past these forms:// <!-- ... -->// <! ... >// <![ ... ]]>// <? ... ?>// Report errors for these forms:// <>// <=// <<token = x.nextToken();// <!if (token == BANG) {c = x.next();if (c == '-') {if (x.next() == '-') {x.skipPast("-->");return false;}x.back();} else if (c == '[') {token = x.nextToken();if ("CDATA".equals(token)) {if (x.next() == '[') {string = x.nextCDATA();if (string.length() > 0) {context.accumulate(config.getcDataTagName(), string);}return false;}}throw x.syntaxError("Expected 'CDATA['");}i = 1;do {token = x.nextMeta();if (token == null) {throw x.syntaxError("Missing '>' after '<!'.");} else if (token == LT) {i += 1;} else if (token == GT) {i -= 1;}} while (i > 0);return false;} else if (token == QUEST) {// <?x.skipPast("?>");return false;} else if (token == SLASH) {// Close tag </token = x.nextToken();if (name == null) {throw x.syntaxError("Mismatched close tag " + token);}if (!token.equals(name)) {throw x.syntaxError("Mismatched " + name + " and " + token);}if (x.nextToken() != GT) {throw x.syntaxError("Misshaped close tag");}return true;} else if (token instanceof Character) {throw x.syntaxError("Misshaped tag");// Open tag <} else {tagName = (String) token;token = null;jsonObject = new JSONObject();boolean nilAttributeFound = false;xmlXsiTypeConverter = null;for (;;) {if (token == null) {token = x.nextToken();}// attribute = valueif (token instanceof String) {string = (String) token;string = new StringBuilder(ATTR_PREFIX).append(string).toString();token = x.nextToken();if (token == EQ) {token = x.nextToken();if (!(token instanceof String)) {throw x.syntaxError("Missing value");}if (config.isConvertNilAttributeToNull()&& NULL_ATTR.equals(string)&& Boolean.parseBoolean((String) token)) {nilAttributeFound = true;} else if(config.getXsiTypeMap() != null && !config.getXsiTypeMap().isEmpty()&& TYPE_ATTR.equals(string)) {xmlXsiTypeConverter = config.getXsiTypeMap().get(token);} else if (!nilAttributeFound) {jsonObject.accumulate(string,config.isKeepStrings()? ((String) token): stringToValue((String) token));}token = null;} else {jsonObject.accumulate(string, "");}} else if (token == SLASH) {// Empty tag <.../>if (x.nextToken() != GT) {throw x.syntaxError("Misshaped tag");}if (config.getForceList().contains(tagName)) {// Force the value to be an arrayif (nilAttributeFound) {context.append(tagName, JSONObject.NULL);} else if (jsonObject.length() > 0) {context.append(tagName, jsonObject);} else {context.put(tagName, new JSONArray());}} else {if (nilAttributeFound) {context.accumulate(tagName, JSONObject.NULL);} else if (jsonObject.length() > 0) {context.accumulate(tagName, jsonObject);} else {context.accumulate(tagName, "");}}return false;} else if (token == GT) {// Content, between <...> and </...>for (;;) {token = x.nextContent();if (token == null) {if (tagName != null) {throw x.syntaxError("Unclosed tag " + tagName);}return false;} else if (token instanceof String) {string = (String) token;if (string.length() > 0) {if(xmlXsiTypeConverter != null) {jsonObject.accumulate(config.getcDataTagName(),stringToValue(string, xmlXsiTypeConverter));} else {jsonObject.accumulate(config.getcDataTagName(),config.isKeepStrings() ? string : stringToValue(string));}}} else if (token == LT) {// Nested elementif (parse(x, jsonObject, tagName, config)) {if (config.getForceList().contains(tagName)) {// Force the value to be an arrayif (jsonObject.length() == 0) {context.put(tagName, new JSONArray());} else if (jsonObject.length() == 1&& jsonObject.opt(config.getcDataTagName()) != null) {context.append(tagName, jsonObject.opt(config.getcDataTagName()));} else {context.append(tagName, jsonObject);}} else {if (jsonObject.length() == 0) {context.accumulate(tagName, "");} else if (jsonObject.length() == 1&& jsonObject.opt(config.getcDataTagName()) != null) {context.accumulate(tagName, jsonObject.opt(config.getcDataTagName()));} else {context.accumulate(tagName, jsonObject);}}return false;}}}} else {throw x.syntaxError("Misshaped tag");}}}}
}

XML 和 JSON 相互转换相关推荐

  1. python json转xml_Python中xml和json格式相互转换操作示例

    本文实例讲述了Python中xml和json格式相互转换操作.分享给大家供大家参考,具体如下: Python中xml和json格式是可以互转的,就像json格式转Python字典对象那样. xml格式 ...

  2. java实体在xml和json之间相互转换

    在我们Java开发 接口调试过程中 经常会遇到  实体转换长json.xml 或者json 转换成实体.xml 等多种情况,今天博主给大家详细举例: 1.原生实体与json 相互转换: User us ...

  3. xml转json和实体类的两种方式

    本文为博主原创,未经允许不得转载: xml在http通信中具有较高的安全性和传输速度,所以应用比较广泛, 在项目中往往需要对xml,json和实体类进行相互转换,在这里总结一下自己所用到的一些方法: ...

  4. xStream完美转换XML、JSON

    xStream框架 xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换: 前面有介绍过json-lib这个框架,在线博文:htt ...

  5. XML和JSON数据格式对比

    概念 XML 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语 ...

  6. WebApi接口 - 响应输出xml和json

    格式化数据这东西,主要看需要的运用场景,今天和大家分享的是webapi格式化数据,这里面的例子主要是输出json和xml的格式数据,测试用例很接近实际常用情况:希望大家喜欢,也希望各位多多扫码支持和点 ...

  7. XML和JSON 数据交换格式

    为什么80%的码农都做不了架构师?>>>    一.什么是数据交换格式? 客户端与服务器常用数据交换格式xml.json.html 二.数据交换格式应用场景 移动端(安卓.IOS)通 ...

  8. Java实现xml和json互转

    pom.xml: <!-- 使用staxon实现xml和json直接互转 --><dependency><groupId>de.odysseus.staxon< ...

  9. XML,Object,Json分析转换Xstream采用

    XML,Object,Json转换之浅析Xstream的使用 请尊重他人的劳动成果,转载请注明出处:XML,Object,Json转换之浅析Xstream的使用 XStream的是一个简单的库.主要用 ...

最新文章

  1. python是最好的语言 永远二十岁_Python是世界上最好的语言吗?
  2. 基于OpenCV的视障人士实时目标检测
  3. 分布式系统关注点(14)——「弹性架构」详解
  4. c#中contextMenuStrip与datagridview使用CellMouseDown事件及treeview使用mousedown事件
  5. 应用深度学习(台大陈蕴侬李宏毅) Part1
  6. 推荐一款软件(作业)
  7. JEECG Online Coding 开发流程
  8. php如何每天自调用不同的ccs,Python-ccs高级选择器 盒模型
  9. mysql单个表_mysql – 哪个更有效:一个长单表还是分布表?为什么?
  10. TVM代码库结构概述
  11. 使用BIGMAP地图下载器,生成卫星地图
  12. 盘点无线互联网战国七雄
  13. tensorflow serving入门笔记
  14. CAD快捷键小结(一)
  15. SWUST OJ(954)
  16. 狄利克雷分布公式_关于狄利克雷分布的理解
  17. githubPC端下载地址
  18. 支气管分割并3D展示效果
  19. linux环境下配置apache ,mysql,php,超简单
  20. 二十四节气——正解反解

热门文章

  1. html标签生成的快捷键
  2. 普通壳的脱壳方法和脱壳技巧
  3. 盘点6个主流的数据分析工具,及优缺点对比
  4. Pandas项目实战1——好莱坞百万级电影评论数据分析
  5. (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  6. sql20005 分页存储过程
  7. python 廖学峰教程_python廖雪峰教程 学习笔记
  8. 阿德莱德大学语言班成绩为C,阿德莱德大学语言课程入学要求
  9. latex输入3.3.1类型的标题
  10. Java开发的几个就业方向