提示:下面案例都引入XML与JSON的工具类才能实现以下方法
一、XML和JSON优缺点(1).XML定义
扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 XML使用DTD(document type definition)文档类型定义来组织数据;格式统一,跨平台和语言,早已成为业界公认的标准。
(2).JSON定义
JSON(Javascript Object Notation)一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。可在不同平台之间进行数据交换。
<1>.XML的优点
1、.格式统一,符合标准;
2、容易与其他系统进行远程交互,数据共享比较方便。
<2>.XML的缺点
1、XML文件庞大,文件格式复杂,传输占带宽;
2、服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护;
3、客户端不同浏览器之间解析XML的方式不一致,需要重复编写很多代码;
4、、服务器端和客户端解析XML花费较多的资源和时间。
1.JSON的优点:
1、.数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
2、.易于解析,客户端Javascript可以简单的通过eval()进行JSON数据的读取;
3、.支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, Javascript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;
4、在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取;
5、.因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。
2.JSON的缺点
1、没有XML格式这么推广的深入人心和喜用广泛,没有XML那么通用性;
2、.JSON格式目前在Web Service中推广还属于初级阶段。
(1).可读性方面。
JSON和XML的数据可读性基本相同,JSON和XML的可读性可谓不相上下,一边是建议的语法,一边是规范的标签形式,XML可读性较好些。
(2).可扩展性方面。
XML天生有很好的扩展性,JSON当然也有,没有什么是XML能扩展,JSON不能的。
(3).编码难度方面。
XML有丰富的编码工具,比如Dom4j、JDom等,JSON也有json.org提供的工具,但是JSON的编码明显比XML容易许多,即使不借助工具也能写出JSON的代码,可是要写好XML就不太容易了。
(4).解码难度方面。
XML的解析得考虑子节点父节点,让人头昏眼花,而JSON的解析难度几乎为0。这一点XML输的真是没话说。
(5).流行度方面。
XML已经被业界广泛的使用,而JSON才刚刚开始,但是在Ajax这个特定的领域,未来的发展一定是XML让位于JSON。到时Ajax应该变成Ajaj(Asynchronous Javascript and JSON)了。
(6).解析手段方面。
JSON和XML同样拥有丰富的解析手段。
(7).数据体积方面。
JSON相对于XML来讲,数据的体积小,传递的速度更快些。
(8).数据交互方面。
JSON与Javascript的交互更加方便,更容易解析处理,更好的数据交互。
(9).数据描述方面。
JSON对数据的描述性比XML较差。
(10).传输速度方面。
JSON的速度要远远快于XML。
正例:
反例:
正例:
反例:
18
name是person的子标记.也是person的后代标记
name是persons的后代标记.
案例:
语法进阶CDATA (了解)
name是length的兄弟标记.
person是name的父标记.
persons是name的祖先标记.
6. 标记名称 允许重复
7. 标记除了开始和结束 , 还有属性.
标记中的属性, 在标记开始时 描述, 由属性名和属性值 组成.
格式:
在开始标记中, 描述属性.
可以包含0-n个属性, 每一个属性是一个键值对!
属性名不允许重复 , 键与值之间使用等号连接, 多个属性之间使用空格分割.
属性值 必须被引号引住.
案例:
注释开始:
代码如下(示例):
public static void main(String[] args) throws IOException, DocumentException {
// 文件获取输入流
FileInputStream fis = new FileInputStream("Demo1.xml");
// 创建XML读取对象
SAXReader sax = new SAXReader();
// 读取并得到文档对象
Document read = sax.read(fis);
// 通过文档获取根元素
Element root = read.getRootElement();
// 开始解析元素
System.out.println(root.getName()); //通过根元素获取子元素book
Element book = root.element("book"); //通过book元素获取子元素name
Element name = book.element("name"); //打印元素name中的内容
System.out.println(name.getText());
System.out.println("-----------------------------");
//把元素放入集合中 通过根元素获取子元素
List
for (int i=0;i<2;i++){
Element book1 = es.get(i); //打印book属性中的‘id’内容
System.out.println(book1.attributeValue("id")); //打印获取book中子元素name的内容
System.out.println(book1.elementText("name"));
System.out.println(book1.elementText("info"));
System.out.println("----------------");
}
// 结束输入流
fis.close();
}
public static void main(String[] args) throws IOException, DocumentException {
String phOne= "17681688646";
//1
//获取到XML资源的输入流
URL utl = new URL("http://apis.juhe.cn/mobile/get?phOne="+phone+"&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253"); //打开链接
URLConnection cOnn= utl.openConnection();
//拿到网址下的输入流
InputStream is = conn.getInputStream();
//2
//创建一个XML读取对象
SAXReader rs = new SAXReader();
//3通过读取对象 读取XML数据 并返回文档对象
Document read = rs.read(is);
//获取根节点
Element root = read.getRootElement();
//5、解析内容
// 获取根节点中resultcode元素的内容 转成Stringt类型的对象
String kod = root.elementText("resultcode");
//如果kod中的内容根200一样则进入if
if ("200".equals(kod)){ // 根据resultcode元素获取result元素中的内容 转成Element类型的对象
Element res = root.element("result"); // 根据resultcode元素获取province元素中的内容 转成String类型的对象
String sheng = res.elementText("province"); // 根据resultcode元素获取citye元素中的内容 转成String类型的对象
String feng = res.elementText("city"); // 如果省份跟市区一样则进入if
if (sheng.equals(feng)){System.out.println("手机号归属地:"+feng);
}else {System.out.println("手机号归属地:"+sheng+" "+feng);
} // 根据resultcode元素获取company元素中的内容 转成String类型的对象
String yu = res.elementText("company");
System.out.println(yu);
}else {//如果手机号查不到则打印手机号不正确
System.out.println("请输入正确的手机号!");
}
}
public static void main(String[] args) throws DocumentException, IOException {
// 文件获取输入流
FileInputStream fis = new FileInputStream("Demo1.xml");
// 创建XML读取对象
SAXReader sax = new SAXReader();
// 读取并得到文档对象
Document read = sax.read(fis);
// 通过文档对象+xpath,查找所有的name节点
List
for (int i = 0;i
System.out.println(names.get(i).getText());
}
//如果name节点是‘多个‘用selectNode方法来查 通过文档对象+xpath,查找book属性和id=‘1001’属性中所有的name节点
List
for (int i = 0;i
System.out.println(name.get(i).getText());
}
//如果name节点是‘一个’用selectSingleNode方法来查 通过文档对象+xpath,查找book属性和id=‘1001’属性中所有的name节点
Node n = read.selectSingleNode("//book[@id='1001']//name");
System.out.println(n.getName()+":"+n.getText());
fis.close();
}
public static void main(String[] args) throws IOException {
Person p = new Person();
p.setName("章梓枫");
p.setAge(19);
//XStream使用
//1、创建XStresm对象
XStream x = new XStream();
//2、修改生成的根节点(可选的, 默认为包名。类名)
//把person生成最外面的节点名
x.alias("person",Person.class);
//3、传入对像开始生成
String xml = x.toXML(p);
System.out.println(xml);
//4、创建文件的输出流
FileOutputStream fos = new FileOutputStream("Dome3.xml");
//5、将输出流转换为XML输出流
XMLWriter xw = new XMLWriter(fos);
//6、写出文档
xw.write(xml);
//释放资源
xw.close();
System.out.println("执行完成!");
}
static class Person{
private String name;
private int age;
@Override
public String toString() {
return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';
}
public Person() {
}
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;
}
}
public static void main(String[] args) throws IOException {
//1、通过文档帮助器,创建一个文档对象
Document dos = DocumentHelper.createDocument();
//2、 给文档添加第一个节点(根节点)
Element book = dos.addElement("books");
//3、通过根节点,丰富子节点
for (int i =0;i<12;i++){
//添加子元素
Element book1 = book.addElement("book");
Element name = book1.addElement("name");
//向name元素中添加内容
name.setText("java");
Element info = book1.addElement("neirong");
//向neirong元素中添加内容
info.setText("讲述了一门编程语言");
//添加属性
book.addAttribute("id",156+i+"");
}
//4、创建文件的输出流
FileOutputStream fos = new FileOutputStream("Dome2.xml");
//5、将输出流转换为XML输出流
XMLWriter xw = new XMLWriter(fos);
//6、写出文档
xw.write(dos);
//释放资源
xw.close();
System.out.println("执行完成!");
}
JSON:
{
“name”:“金苹果”,
“info”:“种苹果”
}
1、一个对象, 由一个大括号表示.
2、括号中 描述对象的属性 . 通过键值对来描述对象的属性
(可以理解为, 大括号中, 包含的是一个个的键值对.)格式:
3、键与值之间使用冒号连接, 多个键值对之间使用逗号分隔.
4、键值对的键 应使用引号引住 (通常Java解析时, 键不使用引号会报错. 而JS能正确解析.)
5、键值对的值, 可以是JS中的任意类型的数据
6、在JSON格式中可以与对象互相嵌套
[元素1,元素2…]
代码如下(示例):
{
"name":"伟杰老师",
"age":18,
"pengyou":["张三","李四","王二","麻子",{
"name":"野马老师",
"info":"像匹野马一样狂奔在技术钻研的道路上"
}],
"heihei":{
"name":"大长刀",
"length":"40m"
}
}
1、将Java中的对象 快速的转换为 JSON格式的字符串.
2、将JSON格式的字符串, 转换为Java的对象.
创建一个Book类给下面的方法使用:
public class Book {
private String id;
private String name;
private String info;
@Override
public String toString() {
return "Book{" +"id='" + id + '\'' +", name='" + name + '\'' +", info='" + 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);
}
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;
}
}
1、将对象转换为JSON字符串
转换JSON字符串的步骤:
//1、创建Gson对象
Gson g= new Gson();
//2、转换
Book b= new Book("1001","科技","关于科技的图书");//把Book中内容转换成JSON类型d
String s = g.toJson(b);
System.out.println(s);
System.out.println("---------------------------------------------");
//如果只用一次Gson可以这样写
String s1 = new Gson().toJson(b);
System.out.println(s1);
2、将JSON字符串转换为对象
代码如下(示例):
//1、创建Gson对象
Gson g= new Gson();
//2、把JSON类型的{"id":"1001","name":"科技","info":"关于科技的图书"} 转换成 java类型的book类 //把JSON类型转换成别的类型的fromJson方法 //要转的类型
Book b = g.fromJson("{\"id\":\"1001\",\"name\":\"科技\",\"info\":\"关于科技的图书\"}", Book.class);
System.out.println(b.getId());
1、将对象转换为JSON字符串
代码如下(示例):
Book b= new Book("1001","科技","关于科技的图书");
//转换成 JSON类型的
String j = JSON.toJSONString(b);
System.out.println(j);
2、将JSON字符串转换为对象
代码如下(示例):
//2、把JSON类型的{"id":"1001","name":"科技","info":"关于科技的图书"} 转换成 java的Book类
Book book = JSON.parseObject("{\"id\":\"1001\",\"name\":\"科技\",\"info\":\"关于科技的图书\"}", Book.class);
System.out.println(book.getId());