Java XML与JSON

XML

简介:

XML是可扩展编辑语言(eXtensible Markup Language)的缩写,它是一种数据表示格式,可以描述非常复杂的数据结构,常用于传输和存储数据。

XML文档形成树状结构,在“根”和“叶子”的分支机构开始的。

  • 使用嵌套结构的数据表示方式,支持格式验证;

  • 常用于配置文件、网络消息传输等。

 <?xml version="1.0" encoding="UTF-8" ?>
    <books>
       <book>
          <name>java编程基础</name>
          <info>Java开发基础</info>
       </book>
    </books>
  • 特点:

    1. 纯文本,默认使用UTF-8编码。
    2. 可以嵌套,适合表示结构化数据。
    3. 如果把XML内容存为文件,那么,他就是一个XML文件,例如book.xml
    4. XMl内容经常通常通过网络作为消息传输。

XML结构:

XML有固定的结构
首行必须是<?xml version="1.0" ?>,可以加上可选的编码。

紧接着, 如果以类似<!DOCTYPE note SYSTEM "book.dtd">声明的是文档定义类型(DTD:Dcocument Type Definition),DTD是可选的。

接下来是XML的文档内容,一个XM文档有且仅有一个根元素,根元素可以包含任意个子元素,元素可以包含属性,例如,<book id="1001">java</book> 包含一个属性id="1001",且元素必须正确嵌套,如果是空元素,可以用 <tag/> 表示。

由于使用了 < > 以及引号等标识符,如果内容出现了特殊符号,需要使用 &???; 表示转义。例如,Java<tm>必须写成:

 <name>Java&lt;tm&gt;</name>

常见的特殊字符如下:
在这里插入图片描述

DOM:

因XML是一种树形结构的文档,它有两种标准的解析API:

  • DOM:一次性读取XML,并在内存中表示为树形结构;
  • SAX:以流的形式读取XML,使用事件回调。

DOM是Document Object Model的缩写,DOM模型就是把XML结构作为一个树形结构处理,从根节点开始,每个节点都可以包含任意个子节点。

  • Document:代表整个XML文档;

  • Element:代表一个XML元素;

  • Attribute:代表一个元素的某个属性。

    DOM可在内存中完整表示XML数据结构;

    DOM解析速度慢,内存占用大。

SAX:

SAX是Simple API for XML的缩写,它是一种基于流的解析方式,边读取XML边解析,并以事件回调的方式让调用者获取数据。因为是一边读一边解析,所以无论XML有多大,占用的内存都很小。

  • SAX是一种流式解析XML的API;

  • SAX通过事件触发,读取速度快,消耗内存小;

  • 调用方必须通过回调方法获得解析过程中的数据。

SAX解析会触发一系列事件:

  • startDocument:开始读取XML文档;
  • startElement:读取到了一个元素,例如;
  • characters:读取到了字符;
  • endElement:读取到了一个结束的元素,例如;
  • endDocument:读取XML文档结束。
InputStream input = Main.class.getResourceAsStream("/book.xml");
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser saxParser = spf.newSAXParser();
saxParser.parse(input, new MyHandler());

关键代码SAXParser.parser()除了需要传入一个InputStream外,还需要传入一个回调对象个,这个丢向要继承自DefaultHandler;

JSON:

JSON是JavaScript Object Notation 的缩写,它去除了所有JavaScript执行代码,只保留JavaScript的对象格式。

JSON作为数据传输的格式,有几个显著的优点

  • JSON只允许使用UTF-8编码,不存在编码问题;

  • JSON只允许使用双引号作为key,特使字符用\转义,格式简单;

  • 浏览器内置JSON支持,如果爸把数据用JSON发送给浏览器,可以用JavaScript直接处理。

因此,JSON适合表示层次结构,因为它格式简单,仅支持以下几种数据类型:

  • 键值对:{“key”:value}

  • 数组:[1,2,3]

  • 字符串:“abc”

  • 数值(整数和浮点数):12.34

  • 布尔值:true或flase

  • 空值:nul

浏览器直接支持使用JavaScript对JSON进行读写:

  // JSON string to JavaScript object:
    jsObj = JSON.parse(jsonStr);
    
    // JavaScript object to JSON string:
    jsonStr = JSON.stringify(jsObj);

常用的用于解析JSON的第三方库有:

  • Jackson
  • Gson
  • Fastjson

小结:
JSON是轻量级的数据表示方式,常用于Web应用;

Jackson可以实现JavaBeanJSON之间的转换;

可以通过Module扩展Jackson能处理的数据类型;

可以自定义JsonSerializerJsonDeserializer来定制序列化和反序列化。

JSON解析:

步骤:

1、引入jar包

Java内部并没有关于JSON解析的内容,因此我们需要从外部引入相应的jar包文件。在引入的时候大家需要注意查看版本,尽量选择最新版以避免漏洞的危害,如阿里的FastJson1.2.69版本就存在一个高危漏洞,我这里使用的是1.2.70版本。大家也可以根据自己的要求来选择。
那么,关于引入jar包,第一步就是下载,

Fastjson下载地址
gson下载地址

此处下载最新地址:
在这里插入图片描述
下载完之后在项目中创建一个lib文件夹
在这里插入图片描述
在这里插入图片描述
将下载好的jar包放进来,可根据自己的选择进行,我这里将两个包都放了进来:
在这里插入图片描述
此时,仔细看两个jar包都是无法展开的,现在进行下一步操作:
在这里插入图片描述
添加Java类库
在这里插入图片描述
选择项目,然后点击ok
在这里插入图片描述
在这里插入图片描述
不用创建modules
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时,我们在点击lib文件夹,发现jar包可以展开了,说明添加成功,可以使用了。
在这里插入图片描述

将对象转换为JSON字符串

为了方便,创建一个Book类来备用:

public class Book {
    String id;
    String name;
    String info;

    public Book(String id, String name, String info) {
        this.id = id;
        this.name = name;
        this.info = info;
    }

    public Book() {
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Book book = (Book) o;
        return Objects.equals(id, book.id) && Objects.equals(name, book.name) && Objects.equals(info, book.info);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, info);
    }

    @Override
    public String toString() {
        return "Book{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", info='" + info + '\'' +
                '}';
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

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

案例:

 public static void main(String[] args) {
        //1.创建Gson对象
        Gson g = new Gson();
        //2.创建一个book对象
        Book book = new Book("1001","java程序设计","java编程基础");
        //3.将对象转换为Json字符串
        String s = g.toJson(book);
        System.out.println(s);
    }

结果如下:
在这里插入图片描述

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

案例:

  public static void main(String[] args) {

        Book b = new Book("1001","安徒生童话","乔");
        String s = JSON.toJSONString(b);
        System.out.println(s);
    }

结果如下:
在这里插入图片描述

将JSON字符串转换为对象

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

案例:

 public static void main(String[] args) {
        //1.创建Gson对象
        Gson g = new Gson();
        //2.将json字符串转换为对象
        Book b = g.fromJson("{\"id\":\"1001\",\"name\":\"java程序设计\",\"info\":\"java编程基础\"}", Book.class);
        System.out.println(b);
    }

结果如下:
在这里插入图片描述

FastJson:
1.  引入JAR包
2.  在需要转换Java对象的位置, 编写如下代码:
    类型 对象名=JSON.parseObject(JSON字符串, 类型.class);
或
    List<类型> list=JSON.parseArray(JSON字符串,类型.class);

案例:

Book book = JSON.parseObject("{\"id\":\"1001\",\"info\":\"乔\",\"name\":\"安徒生童话\"}", Book.class);
        System.out.println(book);
        System.out.println(book.getId());

结果如下:
在这里插入图片描述

List<String> s = JSON.parseArray("[\"一二三\",\"二三四\",\"三四五\"]", String.class);
System.out.println(s.get(1));

结果如下:
在这里插入图片描述
另外,需要注意一点,如果使用HashMap类型 进行数组的转换,转换后的数组类型会变为ArrayList类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值