Java常见数据交换格式——xml、json、yaml
⽬录
数据交换格式
每⼀种编程语⾔都有不同的数据结构,在多个应⽤程序之间,如果编写每⼀个应⽤程序的编程语⾔都不同,那么他们的数据是不能直接传递的,需要将他们转换为特定的格式,然后再进⾏传输,保证发送⽅和接收⽅都能正确的读取数据。
另外,不同操作系统,不同平台之间实现数据共享,也需要将数据转换为两个平台或者操作系统都能读取的格式。
数据交换格式就是“应⽤程序间通信时使⽤的数据格式”,⽽常见的数据交换格式包括:XML、JSON、YAML。
下⾯就是⽤Java来实现上⾯这3种格式的操作。
XML
xml(eXtensible Markup Language),可扩展标记语⾔,详细的介绍可以⾃⾏查阅。
⼀个标准的xml⽂件内容如下(⽰例⽂件名为l):
<?xml version="1.0" encoding="utf-8"?>
<books>
<book id="one">
<name>Java加密与解密的艺术</name>
<price>89</price>
<language>Chinese</language>
<author>梁栋</author>
</book>
<book id="two">
<name>Effective Java</name>
<price>59</price>
<language>English</language>
</book>
</books>
在xml中,有⼏个专业术语:
节点:⽐如上⾯的<books>、<book>、<name>、<price>、<language>、<author>;
节点值:⽐如"Effective Java" 是< name>节点的值;
java加密方式有哪些 属性:⽐如<book>节点的id属性;
属性值:<book>节点的id属性值分别为1、2.
注意,每⼀个节点都可以有⼦节点,⽐如<books>的⼦节点有<book>节点,⽽<book>的⼦节点包括<name>、<price>、<language>、<author>;
在使⽤Java来操作xml的时候,⼀般就是对于上⾯这⼏个内容进⾏处理,⽐如获取节点名称和及节点值、节点属性和属性值。Java常⽤XML解析⽅式有4种:DOM解析、SAX解析、DOM4J解析、JDOM解析。
使⽤DOM⽅式解析
Java中内置了⼀些API来使⽤DOM⽅式解析xml。不需要另外导⼊其他jar包。package st;
l.parsers.DocumentBuilder;
l.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class DOM {
public static void main(String[] args) throws Exception {
// 创建⼀个DocumentBuilderFactory的⼯⼚对象
DocumentBuilderFactory factory = wInstance();
// 利⽤上⼀步创建的⼯⼚对象来创建⼀个DocumentBuilder对象
DocumentBuilder documentBuilder = wDocumentBuilder();
// 利⽤创建的documentBuilder对象,可以调⽤parse()来进⾏解析xml,parse⽅法有下⾯四种重载 // Document parse(InputStream is)
// Document parse(String uri)
// Document parse(File f)
// Document parse(InputStream is, String systemId)
Document document = documentBuilder.parse("l");
// 获得xml中的节点,常⽤的就是下⾯两种⽅式,分别是通过tagName和id来获取节点。
// ElementsByTagName(String tagname);
// ElementById(String tagId);
NodeList bookList = ElementsByTagName("book");
System.out.println("book节点的个数:" + Length());
// 遍历所有book节点,解析book节点的信息
for (int i = 0; i < Length(); i++) {
System.out.println("开始解析第 " + (i+1) + " 个book节点");
// 获取节点集合中的第i个节点
Node book = bookList.item(i);
// 遍历节点的所有属性和属性值
NamedNodeMap attributes = Attributes();
// 获取属性属性的数量
System.out.println("\t该节点有 " + Length() + " 个属性");
// 遍历节点的所有属性信息
for (int j = 0; j < Length(); j++) {
/
/ 获取属性,注意属性也是⼀种节点(Node)
Node attr = attributes.item(j);
// 获取属性名
String attributeName = NodeName();
// 获取属性值
String attributeValue = NodeValue();
short nodeType = NodeType();
System.out.println("\t节点类型为" + nodeType + ", 属性 " + attributeName + "=" + attributeValue );
}
// 可以直接获取节点指定属性名的值,需要将Node类型转换为Element类型
Element element = (Element)book;
System.out.println("\t直接获取id的属性值: " + Attribute("id"));
// 获取⼦节点,注意,两个节点之间的也是⼀个节点(Text节点)
NodeList bookChildList = ChildNodes();
System.out.println("该book节点⼀共有 " + Length() + " 个⼦节点");
// 遍历所有⼦节点,打印⼦节点的信息
for (int j = 0; j < Length(); j++) {
Node childNode = bookChildList.item(j);
// 只获取element类型的节点
if (NodeType() == Node.ELEMENT_NODE) {
// 获取⼦节点的名称
String nodeName = NodeName();
/
/ 获取⼦节点标签之间的内容(值)
String nodeValue = FirstChild().getNodeValue();
// 如果⼀个标签内只有内容,没有其他标签的时候,可以使⽤下⾯这种⽅式获取节点内容
//String nodeValue = TextContent();
System.out.println("\t" + nodeName + "=" + nodeValue);
}
}
System.out.println("------------------------------------------------------\n");
}
}
}
运⾏结果:
book节点的个数:2
开始解析第 1 个book节点
该节点有 1 个属性
节点类型为2, 属性 id=one
直接获取id的属性值: one
该book节点⼀共有 9 个⼦节点
name=Java加密与解密的艺术
price=89
language=Chinese
author=梁栋
-
-----------------------------------------------------
开始解析第 2 个book节点
该节点有 1 个属性
节点类型为2, 属性 id=two
直接获取id的属性值: two
该book节点⼀共有 7 个⼦节点
name=Effective Java
price=59
language=English
------------------------------------------------------
需要注意,使⽤DOM⽅式解析xml时,需要将整个xml⽂件都加载进内存,再进⾏解析。
其次,dom⽅式解析和我们在前端JavaScript DOM编程的⽅式很相似,可以参考JavaScript DOM编程艺术。
使⽤SAX⽅式解析
SAX⽅式和DOM⽅式有⼀个明显的区别:SAX⽅式是从上往下逐个解析的。
Java内置了使⽤SAX⽅式解析xml的API,所以不需要导⼊其他jar包。
使⽤SAX⽅式的解析xml,需要我们⾃⼰定义⼀个Handler(⼀个class),继承DefaultHandler,⾃⼰定义怎么去解析xml中的节点。
package st;
l.sax.Attributes;
l.sax.SAXException;
l.sax.helpers.DefaultHandler;
/**
* ⾃定义的handler
*/
public class MySAXHandler extends DefaultHandler {
/**
* 当开始解析xml的根⽬录时被调⽤(第⼀句xml⽂件声明)
*/
@Override
public void startDocument() throws SAXException {
// TODO Auto-generated method stub
super.startDocument();
System.out.println("开始解析");
}
/**
* 解析元素的开始标签,⽐如<name>abc</name>的<name>标签
* 对于每⼀个元素都会调⽤该⽅法
*/
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // qName 就是元素的标签名,⽐如<name>,就是name
// attributes就是<name>标签中的属性集合
if (qName.equals("book")) {
// 直接获取book标签的id属性值
String id = Value("id");
System.out.println("book标签的id属性值为 " + id);
// 获取book标签的所有属性,并遍历
int attrNum = Length();
for (int i = 0; i < attrNum; i++) {
String attrName = QName(i);
System.out.println("第 " + (i+1) + " 个属性--> " + attrName + "="+ Value(i));
}
} else if (!qName.equals("books") && !qName.equals("book")) {
// 如果不是books标签,也不是book标签,则证明是book的字标签,直接输出即可
System.out.print("解析" + qName + "元素, 节点值为:");
}
}
/**
* 解析标签的⽂本内容,⽐如<name>abc</name>元素的abc
* 每次startElement调⽤结束后都会⾃动调⽤该⽅法
*/
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
// ch字符数组包含了整个xml⽂件内容,通过start和length两个参数来确定数据段。
String text = new String(ch,start, length);
if (!im().equals("")) {
System.out.println(text);
}
}
/**
* 解析元素的结束标签,⽐如<name>abc</name>的</name>标签
* 对于每⼀个元素都会调⽤该⽅法
*/
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
}
/
**
* 当整个xml解析完毕时被调⽤
*/
@Override
public void endDocument() throws SAXException {
// TODO Auto-generated method stub
System.out.println("end");
}
}
编写测试类
package st;
l.parsers.SAXParser;
l.parsers.SAXParserFactory;
public class SAX {
public static void main(String[] args) throws Exception {
// 利⽤SAXParserFactory创建SAXParserFactory的⼯⼚对象
SAXParserFactory factory = wInstance();
// 获取parser对象
SAXParser parser = wSAXParser();
// 创建⼀个Handler对象(我们⾃⼰定义的那个handler)
MySAXHandler handler = new MySAXHandler();
/
/ 传⼊xml⽂件路径,并指定handler
// xml的路径可以是File f、InputStream is、String uri
parser.parse("l", handler);
}
}
运⾏结果:
开始解析
book标签的id属性值为 one
第 1 个属性--> id=one
解析name元素, 节点值为:Java加密与解密的艺术
解析price元素, 节点值为:89
解析language元素, 节点值为:Chinese
解析author元素, 节点值为:梁栋
book标签的id属性值为 two
第 1 个属性--> id=two
解析name元素, 节点值为:Effective Java
解析price元素, 节点值为:59
解析language元素, 节点值为:English
end
使⽤DOM4J⽅式解析
使⽤JDOM⽅式解析
JSON
这⾥介绍⼏种构造json的⽅式:
使⽤JSONObject⽅式将数据转换为JSON格式
使⽤JSONObject,可以将jsonobject对象、map集合、javabean对象中的数据转换为json格式。转换为json格式之后就可以进⾏传输
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论