Java学习周记录——XML与JSON

本文介绍了XML和JSON这两种常用的数据交换格式。详细讲述了XML的语法格式、解析方式(包括SAX、DOM、JDOM和DOM4J)及XML的生成方法,并通过实例演示了如何使用DOM4J和XPath进行XML解析。此外,还介绍了JSON的基础概念,以及如何利用Gson和FastJson这两个库在Java中进行JSON数据的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、XML

XML语法格式

  1. XML文档声明<?xml version="1.0" encoding="UTF-8"?>
  2. 开始标记(开放标记): <标记名称>
    结束标记(闭合标记): </标记名称>
    标记名称: 自定义名称,必须遵循以下命名规则:
  • 名称可以含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • 名称不能以字符 “xml”(或者 XML、Xml)开始
  • 名称不能包含空格,不能包含冒号(:)
  • 名称区分大小写 标记内容: 开始标记与结束标记之间 ,是标记的内容.
  • 标记名称 允许重复
  1. 一个XML文档中, 必须有且且仅允许有一个根标记.
  2. 标记可以嵌套, 但是不允许交叉.
  3. 标记除了开始和结束 , 还有属性.
  4. 标记除了开始和结束 , 还有属性. 标记中的属性, 在标记开始时 描述, 由属性名和属性值 组成. 格式:在开始标记中, 描述属性. 可以包含0-n个属性, 每一个属性是一个键值对! 属性名不允许重复 , 键与值之间使用等号连接, 多个属性之间使用空格分割. 属性值 必须被引号引住.
  5. 注释注释不能写在文档文档声明前 注释不能嵌套注释

二、XML解析

4种XML方式

  1. SAX解析
    SAX解析器, 逐行读取XML文件解析 , 每当解析到一个标签的开始/结束/内容/属性时,触发事件.
    优点:分析能够立即开始,而不是等待所有的数据被处理 逐行加载,节省内存.有助于解析大于系统内存的文档 有时不必解析整个文档,它可以在某个条件得到满足时停止解析.
    缺点:1. 单向解析,无法定位文档层次,无法同时访问同一文档的不同部分数据(因为逐 行解析, 当解析第n行是, 第n-1行已经被释放了, 无法在进行操作了). 2. 无法得知事件发生时元素的层次, 只能自己维护节点的父/子关系. 3. 只读解析方式, 无法修改XML文档的内容.
  2. DOM解析
    DOM解析是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个 文档和内存中建立文档树模型.程序员可以通过操作文档树, 来完成数据的获取 修改 删除等.
    优点:文档在内存中加载, 允许对数据和结构做出更改. 访问是双向的,可以在任何时候在树中双向解析数据。
    缺点:文档全部加载在内存中 , 消耗资源大(可忽略).
  3. JDOM解析
    目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一 个Java特定模型,JDOM一直得到大力推广和促进。 JDOM文档声明其目的是“使用20%的精力解决80%Java/XML问题”
    优点:使用具体类而不是接口,简化了DOM的API。 大量使用了Java集合类,方便了Java开发人员。
    缺点:DOM4J解析XML没有较好的灵活性。 性能不是那么优异。
  4. DOM4J解析
    它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath 支持、XML Schema支持以及用于大文档或流化文档的基于事件的处理。它还提供了构建文档表示的选项, DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一 个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML。

DOM4J解析XML

步骤:
1.引入jar文件
2.创建一个指向XML文件的输入流
FileInputStream fin =new FileInputStream(“文件地址”);
3.创建一个XML读取工具对象
SAXReader sr =new SAXReader();
4.使用读取工具,读取XML文档的输入流,并得到文档对象
Document doc =sr.read(fin);
5.通过文档对象,获取XML文档中的根元素对象
Element e = doc.getRootElement();

DOM4J - XPATH解析XML

路径表达式:

  1. / : 从根节点开始查找
  2. // : 从发起查找的节点位置 查找后代节点
  3. . : 查找当前节点
  4. … : 查找父节点
  5. @ : 选择属性. * 属性使用方式: [@属性名=‘值’] [@属性名>‘值’] [@属性名<‘值’] [@属性名!=‘值’].

获取单一节点:Element e = selectSingleNode(“路径表达式”);
获取所有符合要求节点:List es = selectNodes(“路径表达式”);

Java生成XML (熟悉)

1.通过文档帮助器(DocumentHelper),创建空的文档对象
DocumentHelper doc =DocumentHelper.creatDocument();
2.通过文档对象,向其中添加根节点
Element root = doc.addElement(“根节点名称”);
3.通过根节点添加子节点
Element e1 = root.addElement(“节点名称”);
4.创建一个文件输出流,用于存储XML文件
FileOutputSteam fout =new FileOutputStream(“要存储的位置”);
5.讲文件输出流转换为XML文档输出流
XMLWriter xw =new XMLWriter(fout);
6.写出文档
xw.write(doc);
7.释放资源
xw.close();

XStream

快速的将Java中的对象, 转换为 XML字符串. 使用步骤:

  1. 创建XStream 对象 XStream x = new XStream();
  2. 修改类生成的节点名称 (默认节点名称为 包名.类名) x.alias(“节点名称”,类名.class);
  3. 传入对象 , 生成XML字符串 String xml字符串 = x.toXML(对象);

三、JSON

简介: JSON: JavaScript Object Notation JS对象简谱 , 是一种轻量级的数据

交换格式.

JSON:{
“name”:“金苹果”,
“info”:“种苹果”
}

  • 一个对象, 由一个大括号表示. 括号中 描述对象的属性 . 通过键值对来描述对象的属性 (可以理解为, 大括号中, 包含的是一个个的键值对.)
  • 格式:键与值之间使用冒号连接, 多个键值对之间使用逗号分隔. 键值对的键 应使用引号引住 (通常Java解析时, 键不使用引号会报错. 而JS能正确解析) 键值对的值, 可以是JS中的任意类型的数据
  • 在JSON格式中可以与对象互相嵌套 [元素1,元素2…]
{
 "name":"马六", 
 "age":18, 
 "pengyou":["张三","李四","痞子","麻子",{ 
 						"name":"王五", 
 						"info":"像匹野马一样狂奔在技术钻研的道路上"
 										 }], 
 "heihei":{ "name":"大长刀", "length":"40m" } 
 }

Java与JSON

Gson

  • 将对象转换为JSON字符串
String json = new Gson().toJSON(要转换的对象);
//案例:
Book b = BookDao.find();
String json = new Gson().toJson(b); 
System.out.println(json);
  • 将JSON字符串转换为对象
对象 = 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);

FastJson

  • 将对象转换为JSON字符串
	String json=JSON.toJSONString(要转换的对象);
	//案例:
	Book b = BookDao.find(); 
	String json=JSON.toJSONString(b); 
	System.out.println(json);
  • 将JSON字符串转换为对象
类型 对象名=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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值