基于Java语言了解XML和JSON

基于Java语言来了解XML和JSON

1、基于Java语言了解XML

1.1、了解XML的简介

  XML是可扩展标记语言(eXtensible Markup Language)的简称,该语言在早期被设计出来的初衷是:让数据的存储、传输和交换更统一化和简便化。因此XML所具有的特性便是:(1)平台无关性,是一门独立的标记语言:这个特性可以理解成不管你是用Windows操作系统还是IOS操作系统去使用,也不管你是用Java语言还是其他语言去使用,它都长这样,因为它具有自己独立的语法。(2)具有自我描述性:这个特性可以让使用者很直观的了解使用XML编写的数据文件里的内容,该特性也是依赖于它的语法(标记+内容)。

  对于Java语言这一方面来说,XML在早期的作用可以说非常的大:(1)可以进行网络数据的传输;(2)进行数据存储;(3)进行配置文件的编写。但是在JSON兴起后,前两个实现的作用都被取代了,对于如今的Java编程来说,XML更多的是应用于编写配置文件。

  XML编写的数据可以用(*.XML)文件去存储,当然XML数据也是可以依托其他方式存在的,比如:在内存中构建XML数据,所以不要讲XML语言狭隘的理解为XML文件。

1.2、掌握XML的语法格式

  每种语言想要去使用它,首先得了解这门语言的语法,你不了解语法根本就不能去用这种语言进行沟通,就比如:你不懂英文,你能用中文和不懂中文的老外聊天吗,那显然是不能的。所以了解并掌握语法是学习语言必备的前提。接下来我就来讲讲XML的语法格式吧。

1.2.1、XML文档声明格式

  你所编写的XML数据大多数都会存在于XML文档中,而在编写XML文档需要进行文档声明:声明是由 "<?"、" ?>"这一对符号和该对符号所框住的内容构成,首先编写的是:xml,用来声明这是XML文件。声明下一个一个属性代表的是XML的版本号,最后一个属性指的是文件识别的字符编码(随意选择),千万要注意:该声明的中的 "?" 是一对的,不要少写了。声明格式如下:

		<?xml version="1.0" encoding="UTF-8"?>
1.2.2、XML中的标记的格式

  XML文档中,是由一个个标记(也还可以被称为:元素 / 标签 / 节点)组成的,标记的格式是由开始标记(开放标记)和结束标记(闭合标记)组成,开始标记和结束标记的写法如下:

开始标记: <标记名称> 
结束标记:</标记名称>

1.2.3、标记在XML文档中的书写规则

  标记在XML文档中需要注意的书写规则有:

  1、标记的名称的自定义要遵循以下几点原则:1、名称可以含字母、数字以及其他字符;2、名称不能以数字或标点符号开头;3、名称不能以”XML、xml、Xml“开头;4、名称不能包含空格和冒号( :);5、名称区分大小写。

  在开始标记和结束标记之间的就是标记的内容,就比如用XML来描述一本书:

<?xml version="1.0" encoding="UTF-8"?>
<Book>
	<name>三国演义</name>
	<info>该书是中国的四大名著之一</info>
</Book>

  这一段标记语言代表的就是一本书名为:三国演义,简介为:该书是中国的四大名著之一。是不是很明了简洁,这就体现了XML语言的自我描述性的特征了。

  2、每个XML文档,有且只允许有一个根节点,但在根节点中可以嵌套多个节点,就像我上面展示的XML代码,就只有一个根节点(Book),但根节点之间可以嵌套多个节点(name 和 info);

  3、节点之间可以嵌套,但不可以交叉,节点交叉的效果(不允许书写,切记):

<?xml version="1.0" encoding="UTF-8"?>
<Book>
	<name>三国演义<info></name>
	该书是中国的四大名著之一</info>
</Book>

  4、标记名称可以重复(但根节点有且只能有一个,切记),效果如下:

<?xml version="1.0" encoding="UTF-8"?>
<Books>
	<book>
		<name>三国演义</name>
		<info>该书是中国的四大名著之一</info>
	</book>	
	<book>
		<name>水浒传</name>
		<info>该书是中国的四大名著之一</info>
	</book>
</Books>

  5、标记除了名称外,还可以有属性,属性写在开始标记的名称(记得名称之后要加空格)之后,有多个属性的情况下,用空格隔开每个属性,属性由属性名和属性值组成。属性可要遵循以下原则:1、同一个标记中的属性名不可以重复;2、属性名与属性值之间用等号相连;3、属性值必须用引号引住。格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<Books>
	<book id="1">
		<name>三国演义</name>
		<info>该书是中国的四大名著之一</info>
	</book>	
	<book id="2">
		<name>水浒传</name>
		<info>该书是中国的四大名著之一</info>
	</book>
</Books>
1.2.4、标记之间的层级称呼

  标记之间的层级称呼有:父标记-子标记;祖先标记-后代标记;兄弟标记。拿上面的演示来说明:Books标记和book标记就是父标记-子标记的关系:Books标记是父标记,book标记是子标记;Books标记、name标记和info标记就是祖先标记-后代标记的关系:Books标记是先祖标记,name标记和info标记是后代标记;而name标记和info标记就是兄弟标记的关系。

1.2.5、注释的格式

  有代码的地方肯定少不了注释,毕竟不是人人都懂你写的代码是啥意思,注释就能让别人更好的去阅读你的代码。而XML也有自己的注释格式和规则,规则就是:1、注释不可以写在声明的前面;2、注释不可以进行嵌套。格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--这是注释:下面描述了一本书-->
<Book>
	<name>三国演义</name>
	<info>该书是中国的四大名著之一</info>
</Book>

1.3、了解CDATA

  CDATA是不应该由XML解析器解析的文本数据,是为了解决像 ”<“ 和 ”&“字符的解析问题,因为 ”<“ 在XML中会被解释为新元素的开始;”&“ 在XML中会被解释为字符实体的开始。然而在某些文本中,如JavaScript代码,就会含有大量的 ”<“,”&“ 字符,为避免出现编译错误,可以将脚本代码定义为CDATA,原因是因为CDATA中的内容会被解析器忽略。CDATA的格式:

<?xml version="1.0" encoding="UTF-8"?>
<Book>
	<name>三国演义</name>
	<!--CDATA格式如下:-->
	<info><![CDATA[<该书是中国的四大名著之一>]]></info>
	<!-- 出现错误识别的对比:-->
	<info><该书是中国的四大名著之一></info>
</Book>

  由演示就可以很清楚的看出:info标记的内容由一对尖括号引住,在没有加CDATA的情况下是会被识别成标记的(颜色为红色),加了CDATA的情况就不会被识别成标记(颜色为灰色)。

1.4、了解和掌握Java解析XML文件

  如果有一个XML文件需要你用Java语言编写程序将其中的数据解析出来,那么你需要了解并掌握Java解析XML的方式,解析方式有以下四种:SAX解析方式(了解)、DOM解析方式(了解)、JDOM解析方式(了解)、DOM4J解析方式(掌握)

1.4.1、了解SAX解析

  SAX解析的解析方式是:事件驱动机制,意思是:在SAX解析器逐行进行XML文件解析时,每当解析器读取到标记的开始、结束、内容或属性就会触发一个事件,我们可以编写程序在这些事件发生时,进行相应的处理。

  使用该解析方式的优点:

  • 解析能立即开始,无需等加载所有内容
  • 逐行加载,有利于节省内存,方便解析大于系统内存的文件
  • 在满足条件时会停止解析,不用解析整个文档

  使用该解析方式的缺点:

  • 单向解析,不能往回解析
  • 因为是逐行解析,所以也不能同时解析不同行的内容
  • 无法得知元素的层次,只能自己维护节点的父/子关系
  • 这是只读解析,不能更改XML文档内容
1.4.2、了解DOM解析

  该解析方式是用与平台和语言无关的方式来表示XML文档的官方w3c标准,该解析方式的机制是:需要加载整个文档然后在内存中建立文档数模型。之后便可以通过操作文档树,来完成数据的读取、修改、删除等。

  使用该解析方式的优点:

  • 文档在内存中加载,可以对数据作出更改
  • 解析是双向的,因此可以随时在任何内容处解析数据

  使用该解析方式的缺点(该缺点几乎忽略不计,大多数XML文档所占内存并不大):

  • 文档全部加载在内存中,资源消耗大
1.4.3、了解JDOM解析

  JDOM解析时基于DOM解析优化而来的解析方式:目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一 个Java特定模型,JDOM一直得到大力推广和促进。

  使用该解析方式的优点:

  • 使用具体的类,简化了DOM解析的API
  • 大量使用Java的集合,方便数据的读取和修改

  使用该解析方式的缺点:

  • 没有较好的灵活性
  • 性能不是很优异
1.4.4、掌握DOM4J解析
1.4.4.1、DOM4J解析的介绍

  该解析是JDOM解析的一种智能分支,它合并了许多超出基本XML文档表示的功能,包括集成的XPath支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理,它还提供了构建文档表示的选项。

  该解析方式的优点就是继承了JDOM解析的优点并解决了JDOM解析的缺点,具体表现为:

  • 性能优异
  • 功能强大
  • 使用极其容易
1.4.4.2、使用DOM4J解析本地XML文件的步奏
  1. 在IDEA中导入Jar文件:dom4j.jar
  2. 创建一个指向XML文件的输入流对象fis
		FileInputStream fis = new FileInputStream("XML文件的地址(相对地址或绝对地址都可以)");
  1. 创建一个XML读取工具对象sr
		SAXReader sr = new SAXReader();
  1. 使用读取工具的对象sr调用read方法并传入输入流对象fis,之后得到一个文档对象doc
		Document doc = sr.read(fis);
  1. 通过文档对象doc可以调用getRootElement方法获取根节点元素对象root,也可以调用addElement方法更改根节点的名称并获得更改后的根节点元素root
	Element root = doc.getRootElement();	//获取根节点元素对象
	Element root = doc.addElement(String name);		//更改根节点名称
  1. 接下来便可以用root元素对象调用如下的方法操作数据
	//这些方法只要是Element类的对象就额可以调用
	String name = root.getName();	//获取根节点的名称
	String text = root.getText();	//获取根节点的内容
	String text = root.setText();	//设置根节点的内容
	Element e = root.element(String name);	//获取根节点中第一个子节点名为:name的子节点元素对象
	List<Element> list =root.elements();	//获取根节点的所有子节点元素对象,并转成List集合
	String value = root.attributeValue(String name);	//获取根节点中属性名为:name的属性值
	String text = root.elementText(String name);	//获取根节点中的一个子节点名为:name的内容
	Element e = root.addElement(String name);	//给根节点添加一个子节点名为:name的子节点
	root.addAttribute(String name,String value);	//给根节点设置一个属性名为:name;属性值为:value的属性
1.4.4.3、本地XML文件解析的代码和效果图

  本地的XML文件代码:

<?xml version="1.0" encoding="UTF-8"?>
<Books>
	<book id="1">
		<name>三国演义</name>
		<info>该书是中国的四大名著之一</info>
	</book>	
	<book id="2">
		<name>水浒传</name>
		<info>该书是中国的四大名著之一</info>
	</book>
</Books>

  以下是解析本地XML文件的Java代码:

public class Text {
    public static void main(String[] args) throws IOException, DocumentException {
    	/*XML文件的地址可以是绝对地址(c://Book.xml,XML文件在C盘下),
    	也可以是相对地址(我的就是,在工程根目录下),但是文件一定要存在*/
        FileInputStream fis = new FileInputStream("Book.xml");
        SAXReader sr = new SAXReader();
        Document doc = sr.read(fis);
        Element root = doc.getRootElement();
        System.out.println("根节点名称为:"+root.getName());
        List<Element> list = root.elements();
        for (Element e:list ) {
            String id = e.attributeValue("id");
            String name = e.elementText("name");
            String info = e.elementText("info");
            System.out.println("书本id为:"+id+",书名为:"+name+",简介为:"+info);
            System.out.println("--------------");
        }
        fis.close();
    }
}

  以下是效果图:

在这里插入图片描述

1.4.4.4、使用DOM4J解析网络XML文件的步奏
  1. 在IDEA中导入Jar文件:dom4j.jar
  2. 创建一个URL对象url,写入连接的网址
		 //该网址是可以获得XML文件资源的,不然没效果
		 URL url = new URL("具体的网址");
  1. 创建URLConnection对象con,进行网络连接
		URLConnection con = url.openConnection();
  1. 获取网络资源的输入流
		 InputStream is = con.getInputStream();
  1. 创建一个XML读取工具对象sr
		SAXReader sr = new SAXReader();
  1. 使用读取工具的对象sr调用read方法并传入输入流对象fis,之后得到一个文档对象doc
		Document doc = sr.read(fis);

  之后的步奏就和解析本地XML文件的步骤一致。

1.4.4.5、网络XML文件解析的代码和效果图

  接下来演示通过访问聚合数据网站来获取电话号码相关的数据XML文件,然后通过XML文件解析,来获取该电话号码的归属地、归属地邮政编码和运营商。

  访问聚合数据来获取电话号码相干关数据的XML文件的网址为:

“http://apis.juhe.cn/mobile/get?phone=14715046330&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253”

  我随便选了一个号码来获取的XML文件,忘号主勿怪罪,XML文件内容如下:

在这里插入图片描述

  以下是解析网络XML文件的java代码:

public class Test1 {
    public static void main(String[] args) throws IOException, DocumentException {
        String phone = "14715046330";
        URL url = new URL("http://apis.juhe.cn/mobile/get?phone="+phone+
                "&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
        URLConnection con = url.openConnection();
        InputStream is = con.getInputStream();
        SAXReader sr = new SAXReader();
        Document doc = sr.read(is);
        Element root = doc.getRootElement();
        //获取回应码:回应码为200表示该手机号存在
        String code = root.elementText("resultcode");
        if("200".equals(code)){
            Element result = root.element("result");
            String province = result.elementText("province");
            String city = result.elementText("city");
            String zip = result.elementText("zip");
            String company = result.elementText("company");
            if(province.equals(city)){
            	//当province的值等于city时,说明该地是直辖市
                System.out.println("该电话号码的归属地为:"+city+"市," +
                        "归属地的邮政编码为:"+zip+",运行商为:"+company);
            }else {
                System.out.println("该电话号码的归属地为:"+province+"省,"+city+"市," +
                        "归属地的邮政编码为:"+zip+",运行商为:"+company);
            }
        }else {
            System.out.println("请输入正确的电话号码!");
        }
    }
    is.close();
}

  以下是效果图:

在这里插入图片描述

1.4.4.6、使用XPATH来解析XML文件
1.4.4.6.1、XPATH简介

  XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。

1.4.4.6.2、XPATH语法

  XPATH解析XML文件是通过路径快速的查找一个或一组元素,所以就要了解路径表达式该如何编写,以下是路径表达式的符号所代表的含义:

1、 / :单斜杠表示从根节点开始查找
2、 // :双斜杠表示从发起查找的节点位置 查找后代节点
3、  :一个点表示查找当前节点
4、 ..:两个点表示查找父节点
5、 @ :@表示选择属性,

  @的使用方式:[@属性名=‘值’]、[@属性名>‘值’]、[@属性名<‘值’]、[@属性名!=‘值’]

1.4.4.6.3、使用XPATH解析本地XML文件的步骤

  了解完路径表达式,下面来了解XPATH解析XML文件的步骤:

  1. 在IDEA中导入Jar文件:jaxen-1.1-beta-7.jar
  2. 创建一个指向XML文件的输入流对象fis
		FileInputStream fis = new FileInputStream("XML文件的地址(相对地址或绝对地址都可以)");
  1. 创建一个XML读取工具对象sr
		SAXReader sr = new SAXReader();
  1. 使用读取工具的对象sr调用read方法并传入输入流对象fis,之后得到一个文档对象doc
		Document doc = sr.read(fis);
  1. 通过文档对象doc调用以下两个方法来获取节点对象或节点对象的集合
	//获取一个指定的节点对象
	Element e = doc.selectSingleNode("路径表达式");
	//获取指定的节点的List集合对象
	List<Element> list = doc.selectNodes("路径表达式");
	
	/*Node类是Element类的父类,所以也可以写成下面这样*/	
	//获取一个指定的节点对象
	Node n = doc.selectSingleNode("路径表达式");
	//获取指定的节点的List集合对象
	List<Node> list = doc.selectNodes("路径表达式");
  1. 之后节点对象调用方法来操作数据,方法和上面所介绍的DOM4J的解析方法是一样的
1.4.4.6.4、XPATH解析本地XML文件的代码和效果图

  以下是解析本地XML文件的java代码:

public class Test2 {
    public static void main(String[] args) throws IOException, DocumentException {
        FileInputStream fis = new FileInputStream("Book.xml");
        SAXReader sr = new SAXReader();
        Document doc = sr.read(fis);
        List<Element> name = doc.selectNodes("//name");
        for (Node n:name ) {
            System.out.println("书名为:"+n.getText());
        }
        System.out.println("--------");
        Node n = doc.selectSingleNode("//book[@id='1']//name");
        System.out.println("书名为:"+n.getText());
        fis.close();
    }
}

  以下是效果图:

在这里插入图片描述

  可以看到使用XPATH后代码就简短很多,这就是使用路径来找节点的好处,不用一层一层往下找,直接定位到节点位置,而且还可以根据节点属性来更准确的找到某个节点然后操作数据。

1.4.4.6.5、使用XPATH解析网络XML文件的步奏
  1. 导包,和上面XPATH解析本地XML文件时导的包一样
  2. 创建URL对象url,写入网址,代码和DOM4J解析网络XML文件的一样
  3. 创建URLConnection对象con,建立网络连接,代码和DOM4J解析网络XML文件的一样
  4. 获取资源的输入流,代码和DOM4J解析网络XML文件的一样
  5. 创建一个XML读取工具对象sr,代码和DOM4J解析网络XML文件的一样
  6. 通过文档对象doc调用两个方法来获取节点对象或节点对象的集合,代码和XPATH解析本地XML文件的一样
  7. 之后节点对象调用方法来操作数据,方法和上面所介绍的DOM4J的解析方法是一样的
1.4.6.6.6、XPATH解析网络XML文件的代码和效果图

  还是用电话号码的例子来演示:

  以下是解析网络XML文件的java代码:

public class Test3 {
    public static void main(String[] args) throws IOException, DocumentException {
        String phone = "14715046330";
        URL url = new URL("http://apis.juhe.cn/mobile/get?phone="+phone+
                "&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
        URLConnection con = url.openConnection();
        InputStream is = con.getInputStream();
        SAXReader sr = new SAXReader();
        Document doc = sr.read(is);
        Node code = doc.selectSingleNode("//resultcode");
        Node province = doc.selectSingleNode("//province");
        Node city = doc.selectSingleNode("//city");
        Node zip = doc.selectSingleNode("//zip");
        Node company = doc.selectSingleNode("//company");
        if("200".equals(code.getText())){
            if(province.getText().equals(city.getText())){
                System.out.println("该电话号码的归属地为:"+city.getText()+"市," +
                        "归属地的邮政编码为:"+zip.getText()+",运行商为:"+company.getText());
            }else {
                System.out.println("该电话号码的归属地为:"+province.getText()+"省,"+city.getText()+"市," +
                        "归属地的邮政编码为:"+zip.getText()+",运行商为:"+company.getText());
            }
        }else {
            System.out.println("请输入正确的电话号码!");
        }
    }
}

  以下是效果图:

在这里插入图片描述

  不要感觉和上面的DOM4J解析网络XML文件的代码量差不多,只因为我这个案例中的XML文件中的父/子节点之间的嵌套比较少,当嵌套的父/子节点越多,使用XPATH解析的方式就越方便。

  DOM4J解析XML文件的相关技术知识就讲解到这,下面介绍Java如何编写程序来生成XML文件

1.5、熟悉Java生成XML文件

  Java可以通过代码来解析XML文件,也可以生成XML文件,下面就来介绍Java是如何通过代码来生成XML文件。

1.5.1、Java生成本地XML文件的步骤
  1. 通过文档帮助器DocumentHelper调用createDocument方法生成一个空文档对象doc
	Document doc = DocumentHelper.createDocument();
  1. 通过文档对象doc调用addElement方法添加名称为name的根节点对象root
	Element root = doc.addElement(String name);
  1. 通过节点对象root调用addElement方法添加名称为name的子节点对象e,当然节点对象e也可以调用addElement方法生成它的子节点,可以一直嵌套,丰富节点
	Element e = root.addElement(String name);
  1. 通过节点对象e调用setText方法给节点添加内容为value,调用addAttribute方法给节点e添加属性名为key,属性值为value的属性
	e.setText(String value);
	e.addAttribute(String key,String value);
  1. 创建文件输出流对象fos,并写入文件地址(绝对地址或相对地址)
	FileOutputStream fos = new FileOutputStream("文件地址");
  1. 创建XML文档输出流对象xw将文件输出流转换成XML文档输出流
	XMLWriter xw = new XMLWriter(fos);
  1. 通过XML文档输出流对象调用write方法进行写出操作
	xw.write(doc);
1.5.2、生成本地XML文件的代码和效果图

  以下是Java代码

public class Test4 {
    public static void main(String[] args) throws IOException {
        Document doc = DocumentHelper.createDocument();
        Element persons = doc.addElement("Persons");
        for(int i=1;i<3;i++) {
            Element person = persons.addElement("person");
            Element name = person.addElement("name");
            Element age = person.addElement("age");
            person.addAttribute("id",i+"");
            if(i==1){
                name.setText("张三");
                age.setText("20");
            }else {
                name.setText("王五");
                age.setText("25");
            }
        }
        FileOutputStream fos = new FileOutputStream("person.xml");
        XMLWriter xw = new XMLWriter(fos);
        xw.write(doc);
        fos.close();
        xw.close();
        System.out.println("XML文件生成已完成!");
    }
}

  以下是控制台输出效果

在这里插入图片描述

  以下是生成的XML文件内容

<?xml version="1.0" encoding="UTF-8"?>
<Persons>
    <person id="1">
        <name>张三</name>
        <age>20</age>
    </person>
    <person id="2">
        <name>王五</name>
        <age>25</age>
    </person>
</Persons>
1.5.3、了解XStream的使用

  使用XStream能快速将Java中的对象转换成XML字符串,这样就可以生成XML文件就简单很多了,不用自己去实现添加节点,设置节点内容等操作,该工具中的方法可以很快的自动生成出来。

1.5.3.1、使用XStream生成XML文件的步骤
  1. 在IDEA中导入Jar包:xstream-1.3.1.jar
  2. 创建一个类对象(你自己定义)
  3. 创建XStream对象x
	XStream x = new XStream();
  1. 通过XStream对象x调用alias方法将类生成的根节点名称修改为name(默认的名称是:包名.类名),该步骤也可以省略
	x.alias(String name,类名.class);
  1. 通过XStream对象x调用toXML方法生成XML字符串
	String xml = x.toXML(类对象)
1.5.3.2、XSream生成XML文件的代码

  以下是Java代码

public class Test5 {
    public static void main(String[] args) throws IOException {
        Person p = new Person();
        p.setName("李四");
        p.setAge(18);
        XStream xs = new XStream();
        xs.alias("Person",Person.class);
        String xml = xs.toXML(p);
        System.out.println(xml);
        System.out.println("XML文件生成已完成!");
    }
}

  以下是效果图

在这里插入图片描述

  关于XML的解析就到这,下面进入下个阶段:基于Java语言了解JSON

2、基于Java语言了解JSON

2.1、了解JSON的简介

   JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

2.2、掌握JSON的语法格式

  JSON是一个序列化的对象或数组,而对象和数组的表示方法是不一样的,下面就来详细说明JSON是如何表示一个对象或数组的。

2.2.1、表示对象的格式
  1. JSON表示一个对象用一对大括号表示:{}
  2. 在括号中通过键值对来描述对象的属性,注意属性名一定要用英文的双引号引住,属性值中,字符串用英文双引号引住,数字可以不加引号。
  3. 键值对中的键和值用英文冒号链接,多个键值对之间用英文逗号隔开
  4. 键值对的值可以是:对象、数组、数字、字符串中的一个
2.2.2、表示数组的格式
  1. JSON表示一个数组用一对中括号表示:[]
  2. 在括号中可以添加数组元素,元素可以用对象、数字、字符串中的一个来表示,多个元素之间用英文逗号隔开

  JSON实例:

	{
		"name":"张三",
		"age": 18,
		"friend":[{"name":"李四","age":19},{"name":"王五","age":18},"陈二"]
	}

2.3、了解JSON解析工具

  在Java中常用的JSON解析工具有两种:

  1. Gson,谷歌推出的JSON解析工具
  2. FastJson,阿里推出的JSON解析工具

  要使用这两个工具是要进行引入Jar包操作的,使用Gson工具需要引入的Jar包为:gson-2.8.6.jar;而使用FastJson工具需要引入的Jar包为:fastjson-1.2.70.jar。

2.3.1、掌握使用Gson工具解析JSON
2.3.1.1、将Java对象换成JSON字符串
2.3.1.1.1、 实现步骤
  1. 引入Jar包
  2. 创建一个类对象(自己自定义)
  3. 创建一个Gson类的对象g
	Gson g = new Gson()
  1. 通过对象g调用toJson方法并传入类对象,将类对象转换成JSON字符串
	String json = g.toJson(类对象);
2.3.1.1.2、具体Java代码和效果图

  以下是Java代码

public class Test {
    public static void main(String[] args) {
        Person p = new Person();
        p.setName("张三");
        p.setAge(18);
        Gson g = new Gson();
        String person = g.toJson(p);
        System.out.println(person);
    }
}

  以下是运行效果图

在这里插入图片描述

2.3.1.2、将JSON字符串转换成Java对象
2.3.1.2.1、实现步骤
  1. 引入Jar包
  2. 创建一个类(自己自定义)
  3. 创建一个Gson对象g
	Gson g = new Gson();
  1. 通过对象g调用fromJson方法并传入两个参数:JSON字符串和需要转成的类型,将JSON字符串转换成指定的类型
	<T> t = g.fromJson("JSON字符串", 类型.class);
2.3.1.2.2、具体的Java代码和效果图

  以下是Java代码

public class Test1 {
    public static void main(String[] args) {
        Gson g = new Gson();
        Person person = g.fromJson("{\"name\":\"张三\",\"age\":18}", Person.class);
        System.out.println("姓名:"+person.getName()+",年龄:"+person.getAge());
    }
}

  以下是运行效果图

在这里插入图片描述

2.3.2、掌握使FastJson工具解析JSON
2.3.2.1、将Java对象转换成JSON字符串
2.3.2.1.1、实现步骤
  1. 引入Jar包
  2. 创建一个类对象(自己自定义)
  3. 通过JSON调用toJSONString方法将类对象转换成JSON字符串
	String person = JSON.toJSONString(类对象)
2.3.2.1.2、具体Java代码和效果图

  以下是Java代码

public class Test2 {
    public static void main(String[] args) {
        Person p = new Person();
        p.setName("李四");
        p.setAge(20);
        String person = JSON.toJSONString(p);
        System.out.println(person);
    }
}

  以下是运行效果图

在这里插入图片描述

2.3.2.2、将JSON字符串转换成Java对象
2.3.2.2.1、实现步骤
  1. 引入Jar包
  2. 通过JSON调用parseObject方法并传入两个参数:JSON字符串和需要转成的类型,将JSON字符串转换成指定的类型
	<T> t = JSON.parseObject("JSON字符串", 类型.class);
2.3.2.2.2、具体Java代码和效果图

  以下是Java代码

public class Test3 {
    public static void main(String[] args) {
        Person person = JSON.parseObject("{\"age\":20,\"name\":\"李四\"}", Person.class);
        System.out.println("姓名:"+person.getName()+",年龄:"+person.getAge());
    }
}

  以下是运行效果图

在这里插入图片描述

  关于JSON的相关知识就分享到这,希望文章可以帮到你们。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值