XML和JSON笔记

1. XML介绍

1.1 简介:

Extensible Markup Language,可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。

1.2 特点

  1. XML是一种标记语言,很类似HTML
  2. XML的设计宗旨是传输数据,而不是显示数据
  3. XML只是纯文本,不过能够读懂XML的应用程序可以有针对性地处理XML的标签
  4. XML标签没有预定义,需要自定义标签
  5. XML具有自我描述性(即包含一个文档类型声明,不仅有助于程序员阅读,还有利于计算机识别处理)

1.3 语法格式

  1. XML文档声明
    <?xml version="1.0" encoding="UTF-8"?>
  2. 标记 ( 元素 / 标签 / 节点)
    XML文档,由一个个的标记组成.
语法:
 开始标记(开放标记): <标记名称>
 结束标记(闭合标记): </标记名称> 
 标记名称: 自定义名称,必须遵循以下命名规则:
  a.名称可以含字母、数字以及其他的字符 
  b.名称不能以数字或者标点符号开始 
  c.名称不能以字符 “xml”(或者 XML、Xml)开始 
  d.名称不能包含空格,不能包含冒号(:) 
  e.名称区分大小写 标记内容: 开始标记与结束标记之间 ,是标记的内容.
  1. 一个XML文档中, 必须有且且仅允许有一个根标记.
 正例:
           <names>
              <name>张三</name>
              <name>李四</name>
           </names>
反例:
           <name>李四</name>
           <name>麻子</name>

  1. 标记可以嵌套, 但是不允许交叉.
 正例:    <person>
          <name>李四</name> 
          <age>18</age> 
         </person> 
  反例:    <person>
           <name>李四<age>
           </name> 18</age>
         </person>
  1. 标记的层级称呼 (子标记, 父标记 , 兄弟标记, 后代标记 ,祖先标记) 例如:
    <persons> 
     <person> 
      <name>李四</name> 
      <length>180cm</length>
     </person> 
     <person> 
      <name>李四</name>
      <length>200cm</length> 
     </person>
   </persons>
    name是person的子标记.也是person的后代标记 
    name是persons的后代标记.
  1. 标记名称 允许重复
  2. 标记除了开始和结束 , 还有属性. 标记中的属性, 在标记开始时 描述, 由属性名和属性值 组成. 格式:在开始标记中, 描述属性. 可以包含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>
  1. 注释
注释不能写在文档文档声明前 
 注释不能嵌套注释 
 格式:注释开始: <!-- 
     注释结束: -->

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

文档对象 Document

指的是加载到内存的 整个XML文档.
 常用方法: 
 1. 通过文档对象, 获取XML文档中的根元素对象
    Element root = doc.getRootElement();
 2. 添加根节点 
    Element root = doc.addElement("根节点名称");

元素对象 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 子节点名称);
9. 添加属性
 void addAttribute(String 属性名,String 属性值);

解析本地文件案例:

//1. 获取文件的输入流 
  FileInputStream fis = new FileInputStream("C:\\code\\35\\code1\\day03_XML\\src\\books.xml"); 
//2. 创建XML读取工具对象 
  SAXReader sr = new SAXReader(); 
//3. 通过读取工具, 读取XML文档的输入流 , 并得到文档对象 
  Document doc = sr.read(fis); 
//4. 通过文档对象 , 获取文档的根节点对象 
  Element root = doc.getRootElement(); 
//5. 通过根节点, 获取所有子节点 
  List<Element> es = root.elements(); 
//6. 循环遍历三个book 
for (Element e : es) { 
//1. 获取id属性值 
  String id = e.attributeValue("id"); 
//2. 获取子节点name , 并获取它的内容 
  String name = e.element("name").getText(); 
//3. 获取子节点info , 并获取它的内容 
  String info = e.element("info").getText(); 
  System.out.println("id="+id+",name="+name+",info="+info); }

解析网络文件案例:

  String phone = "18516955565"; 
//1. 获取到XML资源的输入流 
  URL url = new URL("http://apis.juhe.cn/mobile/get? phone="+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("手机号码归属地为:"+city); 
  }else{
    System.out.println("手机号码归属地为:"+province+" "+city); } 
  }else{
    System.out.println("请输入正确的手机号码"); }

1.5 Java生成XML

步骤:
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(); 
案例:
 //1. 通过文档帮助器, 创建空的文档对象 
 Document doc = DocumentHelper.createDocument(); 
 //2. 向文档对象中, 加入根节点对象 
 Element books = doc.addElement("books"); 
 //3. 向根节点中 丰富子节点 
 for(int i=0;i<1000;i++) { 
 //向根节点中加入1000个book节点. 
   Element book = books.addElement("book"); 
 //向book节点, 加入id属性 
   book.addAttribute("id", 1+i+""); 
 //向book节点中加入name和info节点 
   Element name = book.addElement("name");
   Element info = book.addElement("info");    
   name.setText("苹果"+i); 
   info.setText("哈哈哈"+i);
    }
 //4. 创建文件的输出流 
 FileOutputStream fos = new FileOutputStream("c:\\books.xml"); 
 //5. 将文件输出流 , 转换为XML文档输出流 
 XMLWriter xw = new XMLWriter(fos); 
 //6. 写出XML文档 
 xw.write(doc); 
 //7. 释放资源 
 xw.close(); 
 System.out.println("代码执行完毕");

XStream 的使用

快速的将Java中的对象, 转换为 XML字符串. 
使用步骤:
1 创建XStream 对象 
 XStream x = new XStream(); 
2.修改类生成的节点名称 (默认节点名称为 包名.类名) 
 x.alias("节点名称",类名.class); 
3. 传入对象 , 生成XML字符串 
 String xml字符串 = x.toXML(对象); 
 案例: Person p = new Person(1001, "张三", "不详"); 
      XStream x = new XStream(); 
      x.alias("haha", Person.class); 
      String xml = x.toXML(p); 
      System.out.println(xml);

2.JSON

2.1 简介:

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

2.2 对象格式

一本书书名简介

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:
{ 
    "name":"金苹果", 
    "info":"种苹果" 
} 
一个对象, 由一个大括号表示. 
     括号中 描述对象的属性 . 通过键值对来描述对象的属性 
    (可以理解为, 大括号中, 包含的是一个个的键值对.) 
 格式:键与值之间使用冒号连接, 多个键值对之间使用逗号分隔. 
    键值对的键 应使用引号引住 (通常Java解析时,键不使用引号会
    报错.而JS能正确解析.) 键值对的值,可以是JS中的任意类型
    的数据

数组格式
在JSON格式中可以与对象互相嵌套 [元素1,元素2…]

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

3.Java与JSON

做什么?
将Java中的对象 快速的转换为 JSON格式的字符串. 
将JSON格式的字符串, 转换为Java的对象.

GSON

将对象转换为JSON字符串
转换JSON字符串的步骤: 
 1. 引入JAR包 
 2. 在需要转换JSON字符串的位置编写如下代码即可: 
 String json = new Gson().toJSON(要转换的对象); 
 
案例:
  Book b = BookDao.find(); 
  String json = new Gson().toJson(b); 
  System.out.println(json);
将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);

FastJson

将对象转换为JSON字符串
转换JSON字符串的步骤: 
1. 引入JAR包 
2. 在需要转换JSON字符串的位置编写如下代码即可: 
   String json=JSON.toJSONString(要转换的对象); 
案例:
   Book b = BookDao.find(); 
   String json=JSON.toJSONString(b); 
   System.out.println(json);
将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);

4.XML与JSON对比

4.1 XML的优缺点

优点

  • 格式统一,符合标准,在要求严格的场合有优势;
  • -容易与其他系统进行远程交互,数据共享比较方便。

缺点

  • -XML文件庞大,文件格式复杂,传输占带宽大。
  • -服务器端和客户端都需要花费大量代码来解析XML,导致服务器端和客户端代码变得异常复杂且不易维护。

4.2 JSON的优缺点

优点

  • 相当于只是一行字符串,没有结束标签,数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;
  • 因为JSON格式能直接为服务器端代码使用,大大简化了服务器端和客户端的代码开发量,且完成任务不变,并且易于维护。
  • 支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析.
  • 在PHP世界,已经有PHP-JSON和JSON-PHP出现了,偏于PHP序列化后的程序直接调用,PHP服务器端的对象、数组等能直接生成JSON格式,便于客户端的访问提取.

缺点

  • 没有XML格式这么推广的深入人心和使用广泛, 没有XML那么通用。

4.3 区别对比

(1)可读性方面:基本相同,xml的可读性比较好。
(2)可扩展性方面:都具有很好的扩展性。
(3)编码难度方面:相对而言:JSON的编码比较容易。
(4)解码难度:json的解码难度基本为零,xml需要考虑子节点和父节点。
(5)数据体积方面:json相对于xml来讲,数据体积小,传递的速度跟快些。
(6)数据交互方面:json与JavaScript的交互更加方面,更容易解析处理,更好的数据交互。
(7)数据描述方面:xml对数据描述性比较好,常用于做配置文档。
(8)传输速度方面:json的速度远远快于xml。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值