将XML Document 转为 Json 字符串输出
来源:互联网 发布:apache 禁止目录 编辑:程序博客网 时间:2024/06/06 12:29
前提条件:Eclipse,了解Maven,Java。
1、通过Eclipse新建Maven项目,在<Dependencies></Dependencies>中添加如下内容
(Maven会自动下载XML依赖包jdom,以及JSONObject依赖包 json-lib)
<!-- https://mvnrepository.com/artifact/org.jdom/jdom --><dependency> <groupId>org.jdom</groupId> <artifactId>jdom</artifactId> <version>1.1.3</version></dependency><!-- https://mvnrepository.com/artifact/net.sf.json-lib/json-lib --><dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.3</version> <classifier>jdk15</classifier></dependency>2、主程序代码如下:
(自己弄个xml文件读取试一下把,或者移步我的CSDN下载源代码也可以)
import java.io.ByteArrayInputStream;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.util.HashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import org.jdom.Attribute;import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.input.SAXBuilder;import net.sf.json.JSONObject;/** * * */public class App { public static String xml2JSON(String xml) { JSONObject obj = new JSONObject(); try { InputStream is = new ByteArrayInputStream(xml.getBytes("utf-8")); SAXBuilder sb = new SAXBuilder(); Document doc = sb.build(is); Element root = doc.getRootElement(); obj.put(root.getName(), iterateElement(root)); return obj.toString(); } catch (Exception e) { e.printStackTrace(); return null; } } @SuppressWarnings("unchecked") public static JSONObject xml2JSON(File file) { JSONObject obj = new JSONObject(); try { SAXBuilder sb = new SAXBuilder(); Document doc = sb.build(file); Element root = doc.getRootElement(); obj.put(root.getName(), iterateElement(root)); return obj; } catch (Exception e) { e.printStackTrace(); return null; } } @SuppressWarnings({ "unchecked", "rawtypes" }) private static Map iterateElement(Element element) { List jiedian = element.getChildren(); Element et = null; Map map = new HashMap(); List list = null; //增加了对节点的处理 List<Attribute> attributes=element.getAttributes(); for(int i=0;i<attributes.size();i++){ map.put(attributes.get(i).getName(), attributes.get(i).getValue()); } //遍历所有子节点 for (int i = 0; i < jiedian.size(); i++) { list = new LinkedList(); et = (Element) jiedian.get(i); //若 子节点内文本为空 if (et.getTextTrim().equals("")) { if (et.getChildren().size() == 0) //若 没有子节点则继续 continue; //若有 子节点 且 当前map有 本节点名称 if (map.containsKey(et.getName())) { list.add(map.get(et.getName())); //list = (List) map.get(et.getName()); } list.add(iterateElement(et)); if(list.size()>1){ map.put(et.getName(), list); }else{ map.put(et.getName(), list.get(0)); } } else { //子节点内 文本不为空 List<Attribute> temp_att=et.getAttributes(); //若 子节点内有属性 if(temp_att.size()!=0){ Map childMap=new HashMap(); for(int j=0;j<temp_att.size();j++){ childMap.put(temp_att.get(j).getName(), temp_att.get(j).getValue()); } childMap.put("content",et.getTextTrim()); map.put(et.getName(), childMap); }else{ if (map.containsKey(et.getName())) { try{ list = (List) map.get(et.getName()); }catch(Exception e){ list.add(map.get(et.getName())); } } list.add(et.getTextTrim()); if(list.size()>1){ map.put(et.getName(), list); }else{ map.put(et.getName(), list.get(0)); } } } } return map; } public static void main( String[] args ) { File myXml=new File("src\\main\\test.xml");String jsons=App.xml2JSON(myXml).toString();//第一种 输出System.out.println(jsons );//格式化后输出FormatJson format=new FormatJson();System.out.println(format.formatJson(jsons)); }}3、主程序中有个 格式化后输出,此部分代码如下:
新建一个类FormatJson
(这部分代码是转载)
/** * 该类提供格式化JSON字符串的方法。 * 该类的方法formatJson将JSON字符串格式化,方便查看JSON数据。 * <p>例如: * <p>JSON字符串:["yht","xzj","zwy"] * <p>格式化为: * <p>[ * <p> "yht", * <p> "xzj", * <p> "zwy" * <p>] * * <p>使用算法如下: * <p>对输入字符串,追个字符的遍历 * <p>1、获取当前字符。 * <p>2、如果当前字符是前方括号、前花括号做如下处理: * <p>(1)如果前面还有字符,并且字符为“:”,打印:换行和缩进字符字符串。 * <p>(2)打印:当前字符。 * <p>(3)前方括号、前花括号,的后面必须换行。打印:换行。 * <p>(4)每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。 * <p>(5)进行下一次循环。 * <p>3、如果当前字符是后方括号、后花括号做如下处理: * <p>(1)后方括号、后花括号,的前面必须换行。打印:换行。 * <p>(2)每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。 * <p>(3)打印:当前字符。 * <p>(4)如果当前字符后面还有字符,并且字符不为“,”,打印:换行。 * <p>(5)继续下一次循环。 * <p>4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。 * <p>5、打印:当前字符。 * * @author yanghaitao * @version [版本号, 2014年9月29日] */ public class FormatJson { /** * 单位缩进字符串。 */ private static String SPACE = " "; /** * 返回格式化JSON字符串。 * * @param json 未格式化的JSON字符串。 * @return 格式化的JSON字符串。 */ public String formatJson(String json) { StringBuffer result = new StringBuffer(); int length = json.length(); int number = 0; char key = 0; //遍历输入字符串。 for (int i = 0; i < length; i++) { //1、获取当前字符。 key = json.charAt(i); //2、如果当前字符是前方括号、前花括号做如下处理: if((key == '[') || (key == '{') ) { //(1)如果前面还有字符,并且字符为“:”,打印:换行和缩进字符字符串。 if((i - 1 > 0) && (json.charAt(i - 1) == ':')) { result.append('\n'); result.append(indent(number)); } //(2)打印:当前字符。 result.append(key); //(3)前方括号、前花括号,的后面必须换行。打印:换行。 result.append('\n'); //(4)每出现一次前方括号、前花括号;缩进次数增加一次。打印:新行缩进。 number++; result.append(indent(number)); //(5)进行下一次循环。 continue; } //3、如果当前字符是后方括号、后花括号做如下处理: if((key == ']') || (key == '}') ) { //(1)后方括号、后花括号,的前面必须换行。打印:换行。 result.append('\n'); //(2)每出现一次后方括号、后花括号;缩进次数减少一次。打印:缩进。 number--; result.append(indent(number)); //(3)打印:当前字符。 result.append(key); //(4)如果当前字符后面还有字符,并且字符不为“,”,打印:换行。 if(((i + 1) < length) && (json.charAt(i + 1) != ',')) { result.append('\n'); } //(5)继续下一次循环。 continue; } //4、如果当前字符是逗号。逗号后面换行,并缩进,不改变缩进次数。 if((key == ',')) { result.append(key); result.append('\n'); result.append(indent(number)); continue; } //5、打印:当前字符。 result.append(key); } return result.toString(); } /** * 返回指定次数的缩进字符串。每一次缩进三个空格,即SPACE。 * * @param number 缩进次数。 * @return 指定缩进次数的字符串。 */ private String indent(int number) { StringBuffer result = new StringBuffer(); for(int i = 0; i < number; i++) { result.append(SPACE); } return result.toString(); } }
4、运行
阅读全文
0 0
- 将XML Document 转为 Json 字符串输出
- 将字符串转为document
- 将xml转为json
- PHP将JSON转为XML
- vue.js技术知识点之-将json里面的字符串转为json对象并循环输出
- 将json字符串转为json对象
- 【JS】使用javascript将xml转为json
- js:将时间obj转为json字符串
- JackSon将一个对象转为Json字符串
- 使用Gson将json字符串转为map
- js 将json字符串转为js对象
- Gson将负载json字符串转为Javabean
- java将对象转为json字符串
- 将Json字符串转为实体对象
- 使用gson将json字符串转为list
- JSON.parseObject将字符串转为bean对象
- JSON.parseObject将字符串转为bean对象
- javascript xml字符串转为JSON对象
- [BZOJ1529]核电站问题
- 基于双网络双光纤FPGA传输卡的资料
- 图论总结
- 向量外积和内积在编程中的应用
- Android studio 使用Cmake完成C/C++ 的使用以及生成so文件
- 将XML Document 转为 Json 字符串输出
- 读书笔记-javascript dom-2
- 判断素数
- C/C++的调用约定详解——stdcall、cdecl、fastcall、thiscall、naked call
- Linux命令笔记
- Stack的实现
- 挑战练习:评分(四)基于Android编程权威指南(第三版)
- Currency Issue
- 负载均衡