将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、运行


原创粉丝点击