常用类库-XML和JSON

一.XML

1.1 XML的定义

  • XML:用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。

  • XML文件:
  • .XML文件是保存XML数据的一种方式
    XML数据也可以以其他的方式存在(如在内存中构建XML数据)。
    不要将XML语言狭隘的理解成XML文件。
    
  • 针对现在的环境,XML文件用来写基本的配置文件较多

1.2 XML语法

  • 1.XML文档声明
 <?xml version="1.0" encoding="UTF-8"?>
  • 2.标记 ( 元素 / 标签 / 节点)
    XML文档,由一个个的标记组成.
    语法:
    开始标记(开放标记): <标记名称>
    结束标记(闭合标记): </标记名称>
    标记名称: 自定义名称,必须遵循以下命名规则:
    1.名称可以含字母、数字以及其他的字符
    2.名称不能以数字或者标点符号开始
    3.名称不能以字符 “xml”(或者 XML、Xml)开始
    4.名称不能包含空格,不能包含冒号(:)
    5.名称区分大小写
    标记内容: 开始标记与结束标记之间 ,是标记的内容.
    例如 ,我们通过标记, 描述一个人名:
 <name>xxx</name>
  • 3 一个XML文档中, 必须有且且仅允许有一个根标记.
     <names>
       <name>张三</name>
       <name>李四</name>
     </names>
  • 4.标记可以嵌套, 但是不允许交叉
     <person>
       <name>李四</name>
       <age>18</age>
     </person>
  • 5 标记的层级称呼 (子标记, 父标记 , 兄弟标记, 后代标记 ,祖先标记)
    <persons>
       <person>
         <name>李四</name>
         <length>180cm</length>
       </person>
       <person>
         <name>李四</name>
         <length>200cm</length>
       </person>
     </persons>
  • 6 标记除了开始和结束 , 还有属性.
    标记中的属性, 在标记开始时 描述, 由属性名和属性值组成.
    格式:
    在开始标记中, 描述属性.
    可以包含0-n个属性, 每一个属性是一个键值对!
    属性名不允许重复 , 键与值之间使用等号连接, 多个属性之间使用空格分割.
    属性值必须被引号引住.
     <persons>
       <person id="10001" groupid="1">
         <name>李四</name>
         <age>18</age>
       </person>
       <person id="10002" groupid="1">
         <name>李四</name>
         <age>20</age>
       </person>
     </persons>

  • 面试题
    Java中有几种XML解析方式 ? 分别是什么 ? 有什么样的优缺点 ?
    四种
  1. SAX解析
    解析方式是事件驱动机制 !
    SAX解析器, 逐行读取XML文件解析 , 每当解析到一个标签的开始/结束/内容/属性时,触发事件.
    我们可以编写程序在这些事件发生时, 进行相应的处理.
    优点:
    分析能够立即开始,而不是等待所有的数据被处理
    逐行加载,节省内存.有助于解析大于系统内存的文档
    有时不必解析整个文档,它可以在某个条件得到满足时停止解析.
    缺点:
    1. 单向解析,无法定位文档层次,无法同时访问同一文档的不同部分数据(因为逐
    行解析, 当解析第n行是, 第n-1行已经被释放了, 无法在进行操作了).
    2. 无法得知事件发生时元素的层次, 只能自己维护节点的父/子关系.
    3. 只读解析方式, 无法修改XML文档的内容.

  2. DOM解析
    是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个
    文档和内存中建立文档树模型.程序员可以通过操作文档树, 来完成数据的获取 修改 删除等.
    优点:
    文档在内存中加载, 允许对数据和结构做出更改.
    访问是双向的,可以在任何时候在树中双向解析数据。
    缺点:
    文档全部加载在内存中 , 消耗资源大.

  3. JDOM解析
    目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一
    个Java特定模型,JDOM一直得到大力推广和促进。
    JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题”
    (根据学习曲线假定为20%)
    优点:
    使用具体类而不是接口,简化了DOM的API。
    大量使用了Java集合类,方便了Java开发人员。
    缺点:
    没有较好的灵活性。
    性能不是那么优异。

  4. DOM4J解析
    它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath
    支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项,
    DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一
    个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML。
    目前许多开源项目中大量采用DOM4J , 例如:Hibernate


1.3 XML解析

  • DOM4J解析XML:
    步骤:
  1. 引入jar文件 dom4j.jar
  2. 创建一个指向XML文件的输入流
    FileInputStream fis = new FileInputStream(“xml文件的地址”);
  3. 创建一个XML读取工具对象
    SAXReader sr = new SAXReader();
  4. 使用读取工具对象, 读取XML文档的输入流 , 并得到文档对象
    Document doc = sr.read(fis);
  5. 通过文档对象, 获取XML文档中的根元素对象
    Element root = doc.getRootElement();
  • 文档对象 Document
    常用方法:
  1. 通过文档对象, 获取XML文档中的根元素对象
    Element root = doc.getRootElement();
  2. 添加根节点
    Element root = doc.addElement(“根节点名称”);
  • 元素对象 Element
    常用方法:
  1. 获取节点名称
    String getName();

  2. 获取节点内容
    String getText();

  3. 设置节点内容
    String setText();

  4. 根据子节点的名称 , 获取匹配名称的第一个子节点对象.
    Element element(String 子节点名称);

  5. 获取所有的子节点对象
    List elements();

  6. 获取节点的属性值
    String attributeValue(String 属性名称);

  7. 获取子节点的内容
    String elementText(String 子节点名称);

  8. 添加子节点
    Element addElement(String 子节点名称);

  9. 添加属性
    void addAttribute(String 属性名,String 属性值);


    • 实际案例
      解析本地文件:

XML路径:C:\a

<?xml version="1.0" encoding="UTF-8"?>
<books>
	<book id="1001">
		<name>乔一成</name>
		<info>乔家大儿子</info>
	</book>
	<book id="1002">
		<name>乔二强</name>
		<info>乔家二儿子</info>
	</book>
</books>
public class test {
    public static void main(String[] args) throws FileNotFoundException, DocumentException {
        //1.先去获得文件的输入流。什么概念?就是你做饭要菜,先去把菜买来放在厨房的概念
        FileInputStream fileInputStream = new FileInputStream("C:\\a\\a.xml");
        //2.创建xml输入流读取对象        准备做菜的工具
        SAXReader saxReader = new SAXReader();
        //3.通过读取工具读取xml文档的输入流,并得到对象   通过工具把菜做出来当作新对象 其中的一盘菜当成对象 一盘菜中的各种食材又是子节点
        Document document = saxReader.read(fileInputStream);
        //4.通过文档对象获取根节点对象             去得到一整盘菜
        Element rootElement = document.getRootElement();
        //5.通过根节点去获得子节点               去得到一盘菜的各种食材
        List<Element> list =rootElement.elements();  //子节点较多用集合去收集
        for (Element element : list) {
            //获取id属性值
           String id = element.attributeValue("id");
           //获取子节点的名字并且获得其内容
           String name = element.element("name").getText();
           //获取子节点的info并且获得其内容拍那个
            String info  = element.element("info").getText();
            System.out.println("id="+id+"name="+name+"info="+info);
        }
    }
}
------------------------
id=1001name=乔一成info=乔家大儿子
id=1002name=乔二强info=乔家二儿子

  • 网页解析:其实和本地解析类似。只不过把本地的绝对路径改成了网页

  • 在Java中如何编写XML
  •   细节方法上文有提及
    
public class test2 {
    public static void main(String[] args) throws IOException {
        //1.通过文档帮助器,创建一个文档   差不多是缓存的一个概念是虚的 最后给他转成实的
        Document document = DocumentHelper.createDocument();
        //2.给文档添加第一个节点(根节点)
        Element books = document.addElement("books");
        //3.通过根节点 丰富子节点
        for (int j = 0;j<100;j++){
            Element book = books.addElement("book");
            //子节点下再给2个节点
            Element name = book.addElement("name");
            //给name添加内容
            name.setText("武林外传第"+j+"部");

            Element info = book.addElement("info");
            info.setText("这是第"+j+"次描写他们的故事");
        }
        //4.创建一个文件输出流
        FileOutputStream fileOutputStream = new FileOutputStream("C:\\a\\b.xml");
        //5.把输出流转换成xml输出流
        XMLWriter xmlWriter = new XMLWriter(fileOutputStream);
        xmlWriter.write(document);//把上面虚的实体化了
        xmlWriter.close();
    }
}

在这里插入图片描述


  • 怎么把对象以XML形式传给用户
    用到Xstream方法
package com.dgc;

import com.thoughtworks.xstream.XStream;

import java.time.Period;

public class text3 {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("乔一成");
        person.setAge(18);

        //XStream使用
        XStream xStream = new XStream();
        //修改某个类型生成的节点(可选的,默认为包名,类名)
        xStream.alias("name",Person.class);
        //3.传入对象
        String xml = xStream.toXML(person);
        System.out.println(xml);
    }

    static class Person{
        private String name;
        private Integer age;

        public Person() {
        }

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }
}
-----------------------------------------------
<name>
  <name>乔一成</name>
  <age>18</age>
</name>

二.JSON

  • 格式
    一个对象, 由一个大括号表示.括号中 描述对象的属性 . 通过键值对来描述对象的属性
    (可以理解为, 大括号中, 包含的是一个个的键值对.)
    格式:
    键与值之间使用冒号连接, 多个键值对之间使用逗号分隔.
    键值对的键 应使用引号引住 (通常Java解析时, 键不使用引号会报错. 而JS能正确解析.)
    键值对的值, 可以是JS中的任意类型的数据
JSON:
 {
 "name":"金苹果",
 "info":"种苹果"
 }

  • 数组格式
JSON格式中可以与对象互相嵌套
[元素1,元素2...]
{
        "name":"老师",
        "age":18,
        //数组里面也可以嵌套
        "pengyou":["张三","李四","王二","麻子",{
              "name":"野马老师",
              "info":"像匹野马一样狂奔在技术钻研的道路上"
           }],
        "heihei":{
          "name":"大长刀",
          "length":"40m"
       }
     }

  • 2.1Gson(谷歌)

  • 将对象转换为JSON字符串
    转换JSON字符串的步骤:
  1. 引入JAR包
  2. 在需要转换JSON字符串的位置编写如下代码即可:
    String json = new Gson().toJSON(要转换的对象);

案例:
Book b = BookDao.find();
String json = new Gson().toJson(b);
System.out.println(json);

  • 将JSON字符串转换为对象
  1. 引入JAR包
  2. 在需要转换Java对象的位置, 编写如下代码:
    对象 = new Gson().fromJson(JSON字符串,对象类型.class);
    案例:
    String json = "{“id”:1,“name”:“金苹果”,“author”:"李伟杰
    “,“info”:“嘿嘿嘿嘿嘿嘿”,“price”:198.0}”;
    Book book = new Gson().fromJson(json, Book.class);
    System.out.println(book);

  • 2.2FastJson(阿里)

  • 将对象转换为JSON字符串
    转换JSON字符串的步骤:
    1. 引入JAR包
    2. 在需要转换JSON字符串的位置编写如下代码即可:
      String json=JSON.toJSONString(要转换的对象);

案例:
Book b = BookDao.find();
String json=JSON.toJSONString(b);
System.out.println(json);

  • 将JSON字符串转换为对象
  1. 引入JAR包
  2. 在需要转换Java对象的位置, 编写如下代码:
    类型 对象名=JSON.parseObject(JSON字符串, 类型.class);

    List<类型> list=JSON.parseArray(JSON字符串,类型.class);
    案例:
    String json = “{“id”:1,“name”:“金苹果”,“author”:“xxx”,“info”:“嘿嘿嘿嘿嘿嘿”,“price”:198.0}”;
    Book book = JSON.parseObject(json, Book.class);
    System.out.println(book);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,Gson是一个Java的JSON库,可以用于将Java对象转换为JSON格式的字符串,也可以将JSON格式的字符串转换为Java对象。下面是一个简单的示例: 首先,我们需要将Gson库添加到我们的项目中。可以在Maven或Gradle中添加以下依赖项: ```xml <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.6</version> </dependency> ``` 然后,假设我们有一个Person类,如下所示: ```java public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } // getters and setters } ``` 我们可以将这个类转换为JSON格式的字符串,如下所示: ```java Gson gson = new Gson(); Person person = new Person("Alice", 25); String json = gson.toJson(person); System.out.println(json); // {"name":"Alice","age":25} ``` 同样,我们也可以将JSON格式的字符串转换为Java对象,如下所示: ```java String json = "{\"name\":\"Alice\",\"age\":25}"; Person person = gson.fromJson(json, Person.class); System.out.println(person.getName()); // Alice System.out.println(person.getAge()); // 25 ``` 在这个示例中,我们使用了Gson的toJson()方法将Person对象转换为JSON格式的字符串,然后使用fromJson()方法将JSON格式的字符串转换为Person对象。注意,我们需要提供一个Class对象作为fromJson()方法的第二个参数,以便Gson库知道将JSON字符串转换为哪个Java类的对象。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值