目录

七,xml与json

1,XML介绍

1.1 简介

1.2 为什么学习XML?

1.3 XML文件

2,XML语法

1)XML文档声明

2)标记 ( 元素 / 标签 / 节点)

3)一个XML文档中, 必须有且且仅允许有一个根标记.

4)标记可以嵌套, 但是不允许交叉

5)标记的层级称呼 (子标记, 父标记 , 兄弟标记, 后代标记 ,祖先标记)

6)标记名称 允许重复

7)标记除了开始和结束 , 还有属性.

8)注释

语法进阶CDATA (了解)

3,解析XML的方式

3.1 Java解析XML(掌握)

4,XML解析

4.1 DOM4J解析XML(掌握)

4.2 文档对象 Document

4.3 元素对象 Element

4.4 实例操作——解析本地文件

4.5 实例操作——解析网络文件

5,xPATH解析

5.1 路径表达式

5.2 使用步骤

5.3 举例

6,XML生成(熟悉)

6.1 步骤

6.2 案例

6.3 XStream 的使用(了解)

7,JSON介绍

7.1 对象格式

7.2 数组格式

8,JSON解析

8.1 Gson

8.2 FastJson

8.3 举例——配置环境

8.4 编写代码——Gson

8.5 FastJson举例


七,xml与json

配套工具下载03-Java核心类库_XML与JSON(配套工具)

1,XML介绍

1.1 简介

可扩展标记语言(eXtensible Markup Language)。 特性:

  • 1. xml具有平台无关性(系统无关性,语言无关性), 是一门独立的标记语言(不依赖任何东西,也可以描述事物).
  • 2. xml具有自我描述性

1.2 为什么学习XML?

1)网络数据传输.

客户端服务器传输数据时,是传输一段数据,但是如何区分数据主体内容?

  • 若采用特殊符号分割,那数据内容本身含有该特殊符号怎么办?
  • 若采用对象来保存数据,那么不同语言之间改如何交流?

2)数据存储

3)配置文件

1.3 XML文件

.XML文件是保存XML数据的一种方式

XML数据也可以以其他的方式存在(如在内存中构建XML数据)。

不要将XML语言狭隘的理解成XML文件。(也可以是Java对象中一个属性)

2,XML语法

注:在记事本中编写XML文档,若里面含有中文字符,直接双击浏览器打开,可能会产生乱码。可以选择将其粘贴到IDEA中,IDEA会对其进行编码检验。

这样做的原因可能是:记事本和IDEA中编码格式不同。

1)XML文档声明

<?xml version="1.0" encoding="UTF-8"?>

2)标记 ( 元素 / 标签 / 节点)

XML文档,由一个个的标记组成.

语法:

开始标记(开放标记): <标记名称>

结束标记(闭合标记): </标记名称>

标记名称: 自定义名称,必须遵循以下命名规则:

1.名称可以含字母、数字以及其他的字符

2.名称不能以数字或者标点符号开始

3.名称不能以字符 “xml”(或者 XML、Xml)开始

4.名称不能包含空格,不能包含冒号(:)

5.名称区分大小写 标记内容: 开始标记与结束标记之间 ,是标记的内容.

例如 ,我们通过标记, 描述一个人名: <name>李伟杰</name>

3)一个XML文档中, 必须有且且仅允许有一个根标记.

根标记:最外层只能有一个标签

正例:

<names> <name>张三</name> <name>李四</name>
</names> 

反例

<name>李四</name>
<name>麻子</name>

4)标记可以嵌套, 但是不允许交叉

正例

<person> <name>李四</name> <age>18</age>
</person>

反例

<person> <name>李四<age></name> 18</age>
</person>

5)标记的层级称呼 (子标记, 父标记 , 兄弟标记, 后代标记 ,祖先标记)

<persons> <person> <name>李四</name> <length>180cm</length> </person> <person> <name>李四</name> <length>200cm</length> </person>
</persons>

name是person的子标记.也是person的后代标记

name是persons的后代标记

name是length的兄弟标记.

person是name的父标记.

persons是name的祖先标记.

6)标记名称 允许重复

7)标记除了开始和结束 , 还有属性.

标记中的属性, 在标记开始时 描述, 由属性名和属性值 组成.

格式:

  • 在开始标记中, 描述属性.
  • 可以包含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>

8)注释

注释不能写在文档文档声明前

注释不能嵌套注释

格式:

  • 注释开始: <!--
  • 注释结束: -->

语法进阶CDATA (了解)

CDATA

CDATA 是不应该由 XML 解析器解析的文本数据。

像 "<" 和 "&" 字符在 XML 元素中都是非法的。

  • "<" 会产生错误,因为解析器会把该字符解释为新元素的开始。
  • "&" 会产生错误,因为解析器会把该字符解释为字符实体的开始

某些文本,比如 JavaScript 代码,包含大量 "<" 或 "&" 字符。为了避免错误,可以将脚本代 码定义为 CDATA。

CDATA 部分中的所有内容都会被解析器忽略。

CDATA 部分由 "<![CDATA[" 开始,由 "]]>" 结束:

比如:

<![CDATA[<<<>>>]]>

3,解析XML的方式

3.1 Java解析XML(掌握)

面试题:Java中有几种XML解析方式 ? 分别是什么 ? 有什么样的优缺点 ?

四种.

1. SAX解析

介绍

  • 解析方式是事件驱动机制 !
  • SAX解析器, 逐行读取XML文件解析 , 每当解析到一个标签的开始/结束/内容/属性时,触 发事件.
  • 我们可以编写程序在这些事件发生时, 进行相应的处理.

优点:

  • 分析能够立即开始,而不是等待所有的数据被处理 ;
  • 逐行加载,节省内存.有助于解析大于系统内存的文档 ;
  • 有时不必解析整个文档,它可以在某个条件得到满足时停止解析;

缺点:

  • 单向解析,无法定位文档层次,无法同时访问同一文档的不同部分数据(因为逐 行解析, 当解析第n行是, 第n-1行已经被释放了, 无法在进行操作了).
  • 无法得知事件发生时元素的层次,只能自己维护节点的父/子关系.
  • 只读解析方式, 无法修改XML文档的内容.

2. DOM解析

介绍

  • 是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个 文档和内存中建立文档树模型.程序员可以通过操作文档树, 来完成数据的获取 修改 删除等.

优点:

  • 文档在内存中加载, 允许对数据和结构做出更改.
  • 访问是双向的,可以在任何时候在树中双向解析数据。

缺点:

  • 文档全部加载在内存中 , 消耗资源大. (文档普遍较小,可以忽略不记,所以大部分用DOM解析)

3. JDOM解析

介绍

  • 目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一 个Java特定模型,JDOM一直得到大力推广和促进。
  • JDOM文档声明其目的是“使用20%(或更少)的精力解决80%(或更多)Java/XML问题” (根据学习曲线假定为20%)

优点:

  • 使用具体类而不是接口,简化了DOM的API。
  • 大量使用了Java集合类,方便了Java开发人员。

缺点:

  • 没有较好的灵活性。
  • 性能不是那么优异。

4. DOM4J解析 (重点掌握)

介绍

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

4,XML解析

4.1 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();

4.2 文档对象 Document

指的是加载到内存的 整个XML文档.

常用方法:

1. 通过文档对象, 获取XML文档中的根元素对象 ;

Element root = doc.getRootElement(); 

2. 添加根节点 ;(由于一个文档只能有一个根节点,故此方法只用于操作空文档)

Element root = doc.addElement("根节点名称");

4.3 元素对象 Element

指的是XML文档中的单个节点.

常用方法:

1. 获取节点名称

String getName(); 

2. 获取节点内容

String getText(); 

3. 设置节点内容

String setText(); 

4. 根据子节点的名称 , 获取匹配名称的第一个子节点对象.

Element element(String 子节点名称); 

5. 获取所有的子节点对象

 List<Element> elements(); 

6. 获取节点的属性值

String attributeValue(String 属性名称); 

7. 获取子节点的内容

String elementText(String 子节点名称); 

8. 添加子节点

Element addElement(String 子节点名称);

4.4 实例操作——解析本地文件

1)导入jar文件

2)配置

这样就可以在项目中使用类库(进入lib文件夹,发现原先添加的jar文件现在可以展开了)

3)编码——获取单个元素及内容

Demo1.xml

<?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>

Demo.java

package com.kaikeba;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;public class Demo {public static void main(String[] args) throws IOException, DocumentException {// 1,获取输入流FileInputStream fis = new FileInputStream("D://Demo1.xml");// 2,创建XML读取对象SAXReader sr = new SAXReader();// 3,读取并得到文档对象Document doc = sr.read(fis);// 4,通过文档获得根元素Element root = doc.getRootElement();// 5,开始解析元素System.out.println(root.getName());Element book = root.element("book");System.out.println(book.getText());Element name = book.element("name");System.out.println(name.getText());fis.close();}
}

注:若文件出现“Error on line 4 of document  : 1 字节的 UTF-8 序列的字节 1 无效。”的报错信息 ,可以参考这里的解决方法@l执着l【1字节的UTF-8序列的字节1无效】。这里我采用记事本另存为的方法,解决了上述问题。

4)编码——获取多个元素及内容

package com.kaikeba;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class Demo {public static void main(String[] args) throws IOException, DocumentException {// 1,获取输入流FileInputStream fis = new FileInputStream("D://Demo1.xml");// 2,创建XML读取对象SAXReader sr = new SAXReader();// 3,读取并得到文档对象Document doc = sr.read(fis);// 4,通过文档获得根元素Element root = doc.getRootElement();// 5,开始解析元素List<Element> list = root.elements();                  // 获取全部节点for(int i = 0; i < list.size(); i++) {Element book = list.get(i);System.out.println(book.attributeValue("id"));  // 获取属性的值System.out.println(book.elementText("name"));   // 获取节点文本内容System.out.println(book.elementText("info"));   // 获取节点文本内容System.out.println("-------------------------");   // 分割线}fis.close();}
}

4.5 实例操作——解析网络文件

网络文件来自于网址:

http://apis.juhe.cn/mobile/get?%20phone=手机号&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253

运行效果如下:

package com.kaikeba;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;public class Demo {public static void main(String[] args) throws IOException, DocumentException {String phone = "18856306666";               // 非本人号码// 1,获取到XML资源的输入流URL url = new URL("http://apis.juhe.cn/mobile/get?%20phone=" + phone + "&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");URLConnection conn = url.openConnection();  // 打开链接InputStream is = conn.getInputStream();     // 获得输入流// 2,创建XML读取对象SAXReader sr = new SAXReader();// 3,通过读取对象,读取XML数据,并返回文档对象Document doc = sr.read(is);// 4,获取根节点Element root = doc.getRootElement();// 5,解析内容String code = root.elementText("resultcode");if("200".equals(code)) {Element result = root.element("result");String province = result.elementText("province");String city = result.elementText("city");if(province.equals(city)) {System.out.println("号码归属地:" + province);} else {System.out.println("号码归属地:" + province + " " + city);}} else {System.out.println("请输入正确的手机号码");}is.close();}
}

运行效果

5,xPATH解析

5.1 路径表达式

通过路径快速的查找一个或一组元素

路径表达式:

/ : 从根节点开始查找

 // : 从发起查找的节点位置 查找后代节点 (常用)

. : 查找当前节点

 .. : 查找父节点

@ : 选择属性. *

属性使用方式:

[@属性名='值']

[@属性名>'值']

[@属性名<'值']

[@属性名!='值']

举例

books: 路径: //book[@id='1']//name

booksbook id=1 name info book id=2 name info

5.2 使用步骤

通过Node类的两个方法, 来完成查找:

(Node是 Document 与 Element 的父接口)

方法1.

//根据路径表达式, 查找匹配的单个节点

Element e = selectSingleNode("路径表达式"); 

方法2.

List<Element> es = selectNodes("路径表达式");

5.3 举例

1)代码

package com.kaikeba;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class Demo {public static void main(String[] args) throws IOException, DocumentException {// 1,获取输入流FileInputStream fis = new FileInputStream("D://Demo1.xml");// 2,创建XML读取对象SAXReader sr = new SAXReader();// 3,读取并得到文档对象Document doc = sr.read(fis);// 4,通过文档对象+XPATH查找所有name节点List<Node> data = doc.selectNodes("//name");for(Node e : data) {System.out.println(e.getName());System.out.println(e.getText());}fis.close();}
}

2)D://Demo1.xml

<?xml version="1.0" encoding="UTF8"?>
<books><book id="1001"><name>金苹果</name><info>锄禾日当午,苹果很辛苦</info></book><book id="1002"><name>银苹果</name><info>锄禾日当午,苹果很辛苦</info></book>
</books>

3)运行结果

4)网络文档解析

package com.kaikeba;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;public class Demo {public static void main(String[] args) throws IOException, DocumentException {String phone = "18856306666";               // 非本人号码// 1,获取到XML资源的输入流URL url = new URL("http://apis.juhe.cn/mobile/get?%20phone=" + phone + "&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");URLConnection conn = url.openConnection();  // 打开链接InputStream is = conn.getInputStream();     // 获得输入流// 2,创建XML读取对象SAXReader sr = new SAXReader();// 3,通过读取对象,读取XML数据,并返回文档对象Document doc = sr.read(is);// 4,运营商Node node = doc.selectSingleNode("//company");System.out.println("运营商:" + node.getText());is.close();}
}

可以方便的解析想要获取的内容,但是效率本省并没有提高;

6,XML生成(熟悉)

6.1 步骤

步骤:

1. 通过文档帮助器 (DocumentHelper) , 创建空的文档对象;

Document doc = DocumentHelper.createDocument(); 

2. 通过文档对象, 向其中添加根节点;

 Element root = doc.addElement("根节点名称"); 

3. 通过根节点对象root , 丰富我们的子节点;

Element e = root.addElement("元素名称"); 

4. 创建一个文件输出流 ,用于存储XML文件;

FileOutputStream fos = new FileOutputStream("要存储的位置"); 

5. 将文件输出流, 转换为XML文档输出流;

XMLWriter xw = new XMLWriter(fos); 

6. 写出文档;

xw.write(doc); 

7. 释放资源;

xw.close();

6.2 案例

1)代码

package com.kaikeba;import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;public class Demo {public static void main(String[] args) throws IOException, DocumentException {// 1,通过文档帮助器,创建一个文档对象Document doc = DocumentHelper.createDocument();// 2,给文档添加一个节点Element books = doc.addElement("books");// 3,通过根节点丰富子节点for(int i = 0; i < 100; i++) {Element book = books.addElement("book");Element name = book.addElement("name");name.setText("第" + i + "个种苹果的小姑娘");Element info = book.addElement("info");info.setText("第" + i + "个种苹果的故事");book.addAttribute("id", 100 + i + "");}// 4,创建一个文档输出流FileOutputStream fos = new FileOutputStream("books.xml");// 工程所在目录创建文件// 5,将输出流转换为XML输出流XMLWriter xw = new XMLWriter(fos);// 6,写出文档xw.write(doc);// 7,释放资源fos.close();System.out.println("执行完毕");}
}

2)执行效果

 

格式化:Ctrl + Alt + L

6.3 XStream 的使用(了解)

一般情况下,不会通过上述方式,直接从空白文档生成一个XML文件。而是将一个对象转换为XML文件进行传输。这样使用上述方法显得较为复杂,故引入了XStream。

1)使用步骤

快速的将Java中的对象, 转换为 XML字符串.

使用步骤:

1. 创建XStream 对象;

XStream x = new XStream(); 

2.修改类生成的节点名称 (默认节点名称为 包名.类名);

x.alias("节点名称",类名.class); 

3. 传入对象 , 生成XML字符串

String xml字符串 = x.toXML(对象);

2)举例

package com.kaikeba;import com.thoughtworks.xstream.XStream;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Objects;public class Demo {public static void main(String[] args) throws IOException, DocumentException {Person person = new Person("张三", 18);// XStream的使用// 1,创建XStream对象XStream xs = new XStream();// 2,修改某个类型生成的节点(可选,默认为包名+类名)xs.alias("Person", Person.class);// 3,传入对象,开始生成String xml = xs.toXML(person);System.out.println(xml);}// 创建一个类 用于测试static class Person {private String name;private int age;/*** 构造方法*/public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}/*** getter and setter* @return*/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;}/*** 重写equals和HashCode* @param o* @return*/@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return age == person.age &&Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}/*** 重写toString* @return*/@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}}
}

运行结果

 

7,JSON介绍

JSON: JavaScript Object Notation JS对象简谱 , 是一种轻量级的数据交换格式;

相比于XML:解析更简单,数据传输更快

7.1 对象格式

1)举例

一本书

书名

简介

Java

class Book{ private String name; private String info;get/set...
}
Book b = new Book();
b.setName(“金苹果”);
b.setInfo(“种苹果”);
...

JS

var b = new Object();
b.name = "金苹果";
b.info = "种苹果";

XML

<book><name>金苹果</name> <info>种苹果</info>
</book>

JSON(属性的双引号可以省略,属性值不可以,但是在Java中属性最好也加上双引号)

{ "name":"金苹果", "info":"种苹果"
}

2)格式

一个对象, 由一个大括号表示.

括号中 描述对象的属性 . 通过键值对来描述对象的属性 (可以理解为, 大括号中, 包含的是一个个的键值对.)

格式:

  • 键与值之间使用冒号连接, 多个键值对之间使用逗号分隔.
  • 键值对的键 应使用引号引住 (通常Java解析时, 键不使用引号会报错. 而JS能正确解 析.)
  • 键值对的值, 可以是JS中的任意类型的数据

7.2 数组格式

在JSON格式中可以与对象互相嵌套

[元素1,元素2...]

对象中可以套数组,数组中可以套对象

{ "name":"伟杰老师", "age":18, "pengyou":["张三","李四","王二","麻子",{ "name":"野马老师", "info":"像匹野马一样狂奔在技术钻研的道路上" }], "heihei":{ "name":"大长刀", "length":"40m" }
}

8,JSON解析

做什么?

  • 将Java中的对象 快速的转换为 JSON格式的字符串.
  • 将JSON格式的字符串, 转换为Java的对象.

目前Java中没有集成的JSON解析工具,所以常用的解析工具需要自己导入,比如谷歌的Gson,阿里的FastJson。相应的jar包在置顶的链接中可以下载。也可以在GitHub中下载最新的版本。

8.1 Gson

1)将对象转换为JSON字符串

步骤:

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

案例:

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

2)将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);

3)举例

8.2 FastJson

1)将对象转换为JSON字符串

步骤

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

案例:

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

2)将JSON字符串转换为对象

步骤

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

List<类型> list=JSON.parseArray(JSON字符串,类型.class); 

案例:

String json = "{\"id\":1,\"name\":\"金苹果\",\"author\":\"李伟杰 \",\"info\":\"嘿嘿嘿嘿嘿嘿\",\"price\":198.0}";
Book book = JSON.parseObject(json, Book.class);
System.out.println(book);

8.3 举例——配置环境

1)添加jar包

8.4 编写代码——Gson

Book.java

package com.kaikeba;import java.util.Objects;public class Book {private String id;private String name;private String info;public Book() {}public Book(String id, String name, String info) {this.id = id;this.name = name;this.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;}@Overridepublic 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);}@Overridepublic int hashCode() {return Objects.hash(id, name, info);}@Overridepublic String toString() {return "Book{" +"id='" + id + '\'' +", name='" + name + '\'' +", info='" + info + '\'' +'}';}
}

Demo.java(对象转JSON)

package com.kaikeba;import com.google.gson.Gson;
import com.thoughtworks.xstream.XStream;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Objects;public class Demo {public static void main(String[] args) {// 1,创建Gson对象Gson g = new Gson();// 2,转换Book b = new Book("100", "金苹果", "种苹果");String s = g.toJson(b);System.out.println(s);}}

Demo.java(JSON转对象)

package com.kaikeba;import com.google.gson.Gson;
import com.thoughtworks.xstream.XStream;
import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.Objects;public class Demo {public static void main(String[] args) {// 1,创建Gson对象Gson g = new Gson();// 2,转换{"id":"100","name":"金苹果","info":"种苹果"}为对象Book b = g.fromJson("{\"id\":\"100\",\"name\":\"金苹果\",\"info\":\"种苹果\"}", Book.class);System.out.println(b);}}

注意:

8.5 FastJson举例

1)对象转JSON

2)JSON转对象

JSON转数组


章节汇总在这里(づ ̄3 ̄)づ╭❤~@&再见萤火虫&【03-Java核心类库】


对学习Java感兴趣的同学欢迎加入QQ学习交流群:1126298731

有问题欢迎提问,大家一起在学习Java的路上打怪升级!(o゜▽゜)o☆[BINGO!]

03-Java核心类库_XML与JSON相关推荐

  1. Java核心类库(上)

    Java核心类库(上) 参加拉勾教育大数据训练营课程笔记 学会查阅API文档,根据包索引,搜索等. 常用类 java.lang - 唯一一个Java虚拟机自动访问,所以System等不需要import ...

  2. Java核心类库(下)

    文章目录 Java核心类库(下) 异常机制(重点) 基本概念 异常的分类 异常的避免 异常的捕获 异常的抛出 自定义异常 异常机制总结 File类(重点) 基本概念 常用的方法 IO流 IO流的概念 ...

  3. Java核心类库篇8——网络编程

    Java核心类库篇8--网络编程 1.七层网络模型 OSI(Open System Interconnect),即开放式系统互联,是ISO(国际标准化组织)组织在1985 年研究的网络互连模型. 当发 ...

  4. Java核心类库篇7——多线程

    Java核心类库篇7--多线程 1.程序.进程和线程 程序 - 数据结构 + 算法,主要指存放在硬盘上的可执行文件 进程 - 主要指运行在内存中的可执行文件 线程就是进程内部的程序流 操作系统内部支持 ...

  5. Java核心类库篇6——IO

    Java核心类库篇6--IO 1.File 1.1.构造方法 方法声明 功能介绍 public File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 ...

  6. Java核心类库篇5——异常

    Java核心类库篇5--异常 java.lang.Throwable类是Java语言中错误(Error)和异常(Exception)的超类 其中Error类主要用于描述Java虚拟机无法解决的严重错误 ...

  7. Java核心类库篇4——集合

    Java核心类库篇4--集合 1.集合的意义 记录单个数据内容时,则声明一个变量 记录多个类型相同的数据内容时,声明一个一维数组 记录多个类型不同的数据内容时,则创建一个对象 记录多个类型相同的对象数 ...

  8. Java核心类库篇3——util

    Java核心类库篇3--util 1.Date 用于描述特定的瞬间,也就是年月日时分秒,可以精确到毫秒 1.1.构造方法 方法声明 功能介绍 public Date() 获取当前时间表示的date对象 ...

  9. Java核心类库篇2——lang

    Java核心类库篇2--lang 1.Object 该类是所有类的父类,每个类都使用它作为超类,没有任何属性 方法声明 功能介绍 Object() 使用无参方式构造对象 boolean equals( ...

最新文章

  1. 常用控件产品官方文档/手册/API列表 c#控件文档API列表 asp.net控件产品技术文档中文版...
  2. linux富文本软件,CherryTree For Linux
  3. rpm mysql 指定目录_rpm 安装并配置MySQL(包含指定数据存储路径)
  4. 《深入理解 Spring Cloud 与微服务构建》第十一章 服务网关
  5. JS一个根据时区输出时区时间的函数
  6. 个性屏幕保护程序_Mac高清鸟瞰屏幕保护程序,酷毙了
  7. LeetCode(521)——最长特殊序列 Ⅰ(JavaScript)
  8. TCP接收到重叠数据(overlap)后的行为解析-附带一个有关Delay ACK和超时重传的优化
  9. Sentinel 控制台 不显示实时监控
  10. 毕马威《2021年中国证券业调查报告》:金融科技和数字化将成为发展核心
  11. php写的在线试衣,求解模特试衣,布料成衣贴图算法
  12. 因为接了一个外包 我在监狱蹲了456天!
  13. 云上铺体育场馆管理系统能做什么?
  14. main.c(5): warning C206: ‘ds1302_ready‘: missing function-prototype
  15. Mysql插入中文时提示:ERROR 1366 (HY000): Incorrect string value: '\xE5\x8F\xB0\xE5\xBC\x8F...' fo
  16. 第十五章 使用管理门户SQL接口(一)
  17. MySQL 对手机号、身份证号 查询结果 用****加密代替
  18. SpringCloudAlibaba-Sentinel流量监控
  19. Normal.dotm正由另一程序占用或者用户占用 解决方法
  20. 程序员平时上哪些网站

热门文章

  1. c语言能保留x后两位并且四舍五入的,二级C语言真题笔记
  2. qq浏览器HTML5在哪,qq浏览器wifi助手功能在哪里?
  3. 叮,一份详细的LIN收发器选型指南请查收
  4. 简单观察HoudiniAssetComponent状态(AssetState)的变化过程
  5. 基于改进层次凝聚聚类算法的垃圾收运跨区域调度策略
  6. 30年前他发明了万维网,现在他要颠覆互联网
  7. ISDB-T DVB-T DTV ATV
  8. cmd操作MySQL 多表查询(日记 day 4)
  9. 人工只能对php的影响,阿西莫夫眼中的人工智能
  10. python蜂鸣器天空之城频率_用python来一首钢琴solo天空之城