XML与JSON

XML的解析方式有四种:

  • DOM解析
  • SAX解析
  • DOM4J解析
  • JDOM解析
  • 一、DOM解析:

            与 js 中的类似,使用 JAXP(Java API for XML Parsing),即:用于 XML 解析的 Java API.DOM(Document Object Model, 文档对象模型),在应用程序中,基于 DOM 的 XML

    分析器将一个 XML 文档转换成一个对象模型的集合(通常称为 DOM 树),应用程序正是通过对这个对象模型的操作,来实现对 XML 文档数据的操作。XML 本身是以树状的形式出现的,所以 DOM 操作的时候,也将按章树的形式进行转换。在整个 DOM 树种,最大的地方指的是 Document,表示一个文档,在这个文档中存在一个根节点。

    注意:在使用 DOM 操作的时候,每一个文字的区域也是一个节点,称为文本节点。核心操作接口在 DOM 解析中有以下四个核心的操作接口

    Document : 此接口代表了整个 XML 文档,表示的是整棵 DOM 树的根,提供了对文档中的数据进行访问和操作的入口,通过 Document 节点可以访问 XML 文件中所有的元素内容。
    Node : 此接口在整个 DOM 树种具有举足轻重的低位,DOM 操作的核心接口中有很大一部分接口是从 Node 接口继承过来的。例如:Document、Element 等接口,在 DOM树种,每一个 Node 接口代表了 DOM 树种的一个节点。
    NodeList : 此接口表示的是一个节点的集合,一般用于表示有顺序关系的一组节点,
    例如:一个节点的子节点,当文档改变的时候会直接影响到 NodeList 集合。

    NamedNodeMap : 此接口表示的是一组节点和其唯一名字对应的一一对应关系,本接口主要用于属性节点的表示上。
    DOM 解析过程

    如果一个程序需要进行 DOM 解析读取操作的话,也需要按照如下的步骤进行:

     1.建 立 DocumentBuilderFactory : DocumentBuilderFactory factory =
    DocumentBuilderFactory.newInstance();
    2.建立 DocumentBuilder: DocumentBuilder builder = factory.newDocumentBuilder();
    3.建立 Document : Document doc = builder.parse(“要解析的文件路径”);
    4.建立 NodeList : NodeList nl = doc.getElementsByTagName(“读取节点”);
    5.进行 XML 信息读取
              DOM 操作除了可以进行解析外,也可以进行文档的生成,如果想要生成 XML 文件,则在创建文档的时候,就应该使用 newDocument()方法,如果要将 DOM 的文档输出,本身是比较麻烦的 。一次编写多次 copy

    二、另一种解析方式:SAX

    SAX(Simple API for XML)解析是按照 xml 文件的顺序一步一步的来解析。SAX 没有官方的标准机构,它不属于任何标准阻止或团体,也不属于任何公司或个人,而是提供任何人使用的一种计算机技术。SAX(Simple API for XML,操作 XML 的简单接口),与 DOM 操作不同的是,SAX 采用的是一种顺序的模式进行访问,是一种快速读取 XML 数据的方式。当使用 SAX 解析器进行操作的时候会触发一系列的事情,当扫描到文档(document)开始与结束、元素(element)开始与结束时都会调用相关的处理方法,并由这些操作方法作出相应的操作,直至整个文档扫描结束。如果要想实现这种 SAX 解析,则肯定首先建立一个 SAX 的解析器

    基本解析步骤:

    // 1、创建解析器工厂

    SAXParserFactory factory = SAXParserFactory.newInstance();

    // 2、获得解析器

    SAXParser parser = factory.newSAXParser();

    // SAX解析器 ,继承 DefaultHandler

    String path = new File("resource/demo01.xml").getAbsolutePath();

    // 解析

    parser.parse(path, new MySaxHandler());

     

    三、DOM4J解析

    dom4j 是一个简单的开源库,用于处理 XML、 XPath 和 XSLT,它基于 Java 平台,使用 Java 的集合框架,全面集成了 DOM,SAX 和 JAXP。下载路径:

    http://www.dom4j.org/dom4j-1.6.1/

    http://sourceforge.net/projects/dom4j

    可以使用 DOM4J 进行 XML 文件的读、写操作DOM4J 与 JDOM 一样都属于一个免费的 XML 开源组建,但是由于现在的开发框架中使用该技术较多,比如 Hibernate、Spring 等都使用 DOM4J 这个功能,所以作为介绍,大家可以对该组件有一个了解。并没有谁好谁坏,一般框架使用 DOM4J 较多,而我们平时如果要用则 JDOM 较常见。可以发现 DOM4J 发挥了很多新特性,比如输出格式就可以很好解析

    代码如下:

    File file = new File("resource/outputdom4j.xml");

    SAXReader reader = new SAXReader();

    // 读取文件作为文档

    Document doc = reader.read(file);

    // 获取文档的根元素

    Element root = doc.getRootElement();

    // 根据跟元素找到全部的子节点

    Iterator<Element> iter = root.elementIterator();

    while(iter.hasNext()){
    Element name = iter.next();

    System.out.println("value = " + name.getText());

    }

    // 使用DocumentHelper来创建 Document对象

    Document document = DocumentHelper.createDocument();

    // 创建元素并设置关系

    Element person = document.addElement("person");

    Element name = person.addElement("name");

    Element age = person.addElement("age");

    // 设置文本

    name.setText("shsxt");

    age.setText("10");

    // 创建格式化输出器

    OutputFormat of = OutputFormat.createPrettyPrint();

    of.setEncoding("utf-8");

    // 输出到文件

    File file = new File("resource/outputdom4j.xml");

    XMLWriter writer = new XMLWriter(new FileOutputStream(new

    File(file.getAbsolutePath())),of);

    // 写出

    writer.write(document);

    writer.flush();

    writer.close();

    四、JDOM解析

    下载路径: http://www.jdom.org/downloads/index.html

    JDOM 是一种使用 XML 的独特 Java 工具包,用于快速开发 XML 应用程序。JDOM 是一个开源项目,它基于树形结构,利用纯 Java 的技术对 XML 文档实现解析、生成、序列化及多种操作。

    JDOM 解析

    掌握 JDOM 开发工具的使用及产生原理可以使用 JDOM 进行读取或写入的操作在 W3C 本身提供的 XML 操作标准,DOM 和 SAX,但是从开发角度上看,DOM 和 SAX本身是各有特点的,DOM 可以修改,但不适合读取大文件,而 SAX 可以读取大文件,但是本身不能修改所谓的 JDOM = DOM 的可修改 + SAX 的读取大文件JDOM 本身是一个免费的开源组建,直接从 www.jdom.org 上下载下载后解压,将 jdom.jar 包拷贝到 Tomcat 目录(项目)的 lib 中

    JDOM 主要操作的类:

    我们发现 JDOM 的输出操作要比传统的 DOM 方便得多,而且也更加直观,包括在输出的时候都很容易了。此时观察到的是 JDOM 对于 DOM 解析的支持,但是也说,JDOM 本身也支持了 SAX 的特点;所以,可以使用 SAX 进行解析操作。

    解析

    // 获取SAX解析器

    SAXBuilder builder = new SAXBuilder();

    File file = new File("resource/demo01.xml");

    // 获取文档

    Document doc = builder.build(new File(file.getAbsolutePath()));

    // 获取根节点

    Element root = doc.getRootElement();

    System.out.println(root.getName());

    // 获取根节点下所有的子节点, 也可以根据标签名称获取指定的直接点

    List<Element> list = root.getChildren();

    System.out.println(list.size());

    for(int x = 0; x<list.size(); x++){
    Element e = list.get(x);

    // 获取元素的名称和里面的文本

    String name = e.getName();

    System.out.println(name + "=" + e.getText());

    System.out.println("==================");}

    // 创建节点

    Element person = new Element("person");

    Element name = new Element("name");

    Element age = new Element("age");

    // 创建属性

    Attribute id = new Attribute("id","1");

    // 设置文本

    name.setText("shsxt");

    age.setText("10");

    // 设置关系

    Document doc = new Document(person);

    person.addContent(name);

    name.setAttribute(id);

    person.addContent(age);

    XMLOutputter out = new XMLOutputter();

    File file = new File("resource/outputjdom.xml");

    out.output(doc, new FileOutputStream(file.getAbsoluteFile()));
     


    JSON的三种解析方式

  • 一、什么是JSON?

    JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度。

    JSON就是一串字符串 只不过元素会使用特定的符号标注。

    {} 双括号表示对象

    [] 中括号表示数组

    "" 双引号内是属性或值

    : 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)

    所以 {"name": "Michael"} 可以理解为是一个包含name为Michael的对象

    而[{"name": "Michael"},{"name": "Jerry"}]就表示包含两个对象的数组

    当然了,你也可以使用{"name":["Michael","Jerry"]}来简化上面一部,这是一个拥有一个name数组的对象

    二、JSON解析之传统的JSON解析

    1、生成json字符串

    public static String createJsonString(String key, Object value) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put(key, value);
            return jsonObject.toString();
    }

    2、解析JSON字符串

    分为以下三种情况,一个JavaBean,一个List数组,一个嵌套Map的List数组:

    复制代码

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Map;
    
    import org.json.JSONArray;
    import org.json.JSONObject;
    
    import com.android.myjson.domain.Person;
    
    /**
     * 完成对json数据的解析
     * 
     */
    public class JsonTools {
    
    
        public static Person getPerson(String key, String jsonString) {
            Person person = new Person();
            try {
                JSONObject jsonObject = new JSONObject(jsonString);
                JSONObject personObject = jsonObject.getJSONObject("person");
                person.setId(personObject.getInt("id"));
                person.setName(personObject.getString("name"));
                person.setAddress(personObject.getString("address"));
            } catch (Exception e) {
                // TODO: handle exception
            }
            return person;
        }
    
        public static List getPersons(String key, String jsonString) {
            List list = new ArrayList();
            try {
                JSONObject jsonObject = new JSONObject(jsonString);
                // 返回json的数组
                JSONArray jsonArray = jsonObject.getJSONArray(key);
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject2 = jsonArray.getJSONObject(i);
                    Person person = new Person();
                    person.setId(jsonObject2.getInt("id"));
                    person.setName(jsonObject2.getString("name"));
                    person.setAddress(jsonObject2.getString("address"));
                    list.add(person);
                }
            } catch (Exception e) {
                // TODO: handle exception
            }
            return list;
        }
    
        public static List getList(String key, String jsonString) {
            List list = new ArrayList();
            try {
                JSONObject jsonObject = new JSONObject(jsonString);
                JSONArray jsonArray = jsonObject.getJSONArray(key);
                for (int i = 0; i < jsonArray.length(); i++) {
                    String msg = jsonArray.getString(i);
                    list.add(msg);
                }
            } catch (Exception e) {
                // TODO: handle exception
            }
            return list;
        }
    
        public static List> listKeyMaps(String key,
                String jsonString) {
            List> list = new ArrayList>();
            try {
                JSONObject jsonObject = new JSONObject(jsonString);
                JSONArray jsonArray = jsonObject.getJSONArray(key);
                for (int i = 0; i < jsonArray.length(); i++) {
                    JSONObject jsonObject2 = jsonArray.getJSONObject(i);
                    Map map = new HashMap();
                    Iterator iterator = jsonObject2.keys();
                    while (iterator.hasNext()) {
                        String json_key = iterator.next();
                        Object json_value = jsonObject2.get(json_key);
                        if (json_value == null) {
                            json_value = "";
                        }
                        map.put(json_key, json_value);
                    }
                    list.add(map);
                }
            } catch (Exception e) {
                // TODO: handle exception
            }
            return list;
        }
    }

     三、JSON解析之GSON

  • 1、生成JSON字符串

    import com.google.gson.Gson;
    
    public class JsonUtils {
    
        public static String createJsonObject(Object obj) {
            Gson gson = new Gson();
            String str = gson.toJson(obj);
            return str;
    
        }
    }
    二、解析JSON
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;
    
    ;
    public class GsonTools {
    
        public GsonTools() {
            // TODO Auto-generated constructor stub
        }
    
        /**
         * @param 
         * @param jsonString
         * @param cls
         * @return
         */
        public static  T getPerson(String jsonString, Class cls) {
            T t = null;
            try {
                Gson gson = new Gson();
                t = gson.fromJson(jsonString, cls);
            } catch (Exception e) {
                // TODO: handle exception
            }
            return t;
        }
    
        /**
         * 使用Gson进行解析 List
         * 
         * @param 
         * @param jsonString
         * @param cls
         * @return
         */
        public static  List getPersons(String jsonString, Class cls) {
            List list = new ArrayList();
            try {
                Gson gson = new Gson();
                list = gson.fromJson(jsonString, new TypeToken>() {
                }.getType());
            } catch (Exception e) {
            }
            return list;
        }
    
        /**
         * @param jsonString
         * @return
         */
        public static List getList(String jsonString) {
            List list = new ArrayList();
            try {
                Gson gson = new Gson();
                list = gson.fromJson(jsonString, new TypeToken>() {
                }.getType());
            } catch (Exception e) {
                // TODO: handle exception
            }
            return list;
        }
    
        public static List> listKeyMaps(String jsonString) {
            List> list = new ArrayList>();
            try {
                Gson gson = new Gson();
                list = gson.fromJson(jsonString,
                        new TypeToken>>() {
                        }.getType());
            } catch (Exception e) {
                // TODO: handle exception
            }
            return list;
        }
    }

     

    三、JSON解析之FastJSON

    import java.util.ArrayList;
    import java.util.List;
    import java.util.Map;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.TypeReference;
    
    public class JsonTool {
    
        public static  T getPerson(String jsonstring, Class cls) {
            T t = null;
            try {
                t = JSON.parseObject(jsonstring, cls);
            } catch (Exception e) {
                // TODO: handle exception
            }
            return t;
        }
    
        public static  List getPersonList(String jsonstring, Class cls) {
            List list = new ArrayList();
            try {
                list = JSON.parseArray(jsonstring, cls);
            } catch (Exception e) {
                // TODO: handle exception
            }
            return list;
        }
    
        public static  List> getPersonListMap1(
                String jsonstring) {
            List> list = new ArrayList>();
            try {
                list = JSON.parseObject(jsonstring,
                        new TypeReference>>() {
                        }.getType());
    
            } catch (Exception e) {
                // TODO: handle exception
            }
    
            return list;
        }
    }

     

    总结:

    JSON对于移动设备来说,尤其对于网络环境较差和流量限制的情况下,相对于XML格式的数据传输会更节省流量,传输效率更高。在这三种解析方式中FastJson是效率最高的,推荐使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值