XML&JSON

XML:

1. 概念:Extensible Markup Language 可扩展标记语言
	* 可扩展:标签都是自定义的。 <user>  <student>

	* 功能
		* 存储数据
			1. 配置文件
			2. 在网络中传输
	* xml与html的区别
		1. xml标签都是自定义的,html标签是预定义。
		2. xml的语法严格,html语法松散
		3. xml是存储数据的,html是展示数据

	* w3c:万维网联盟
	2. 语法:
	* 基本语法:
		1. xml文档的后缀名 .xml
		2. xml第一行必须定义为文档声明
		3. xml文档中有且仅有一个根标签
		4. 属性值必须使用引号(单双都可)引起来
		5. 标签必须正确关闭
		6. xml标签名称区分大小写
	* 快速入门:
		<?xml version='1.0' ?>
		<users>
			<user id='1'>
				<name>zhangsan</name>
				<age>23</age>
				<gender>male</gender>
				<br/>
			</user>
			
			<user id='2'>
				<name>lisi</name>
				<age>24</age>
				<gender>female</gender>
			</user>
		</users>
		
	* 组成部分:
		1. 文档声明
			1. 格式:<?xml 属性列表 ?>
			2. 属性列表:
				* version:版本号,必须的属性
				* encoding:编码方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1
				* standalone:是否独立
					* 取值:
						* yes:不依赖其他文件
						* no:依赖其他文件
		2. 指令(了解):结合css的
			* <?xml-stylesheet type="text/css" href="a.css" ?>
		3. 标签:标签名称自定义的
			* 规则:
				* 名称可以包含字母、数字以及其他的字符 
				* 名称不能以数字或者标点符号开始 
				* 名称不能以字母 xml(或者 XML、Xml 等等)开始 
				* 名称不能包含空格 

		4. 属性:
			id属性值唯一
		5. 文本:
			* CDATA区:在该区域中的数据会被原样展示
				* 格式:  <![CDATA[ 数据 ]]>

Java解析XML

面试题

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

解析本地文件案例:

public class DemoXml {
    public static void main(String[] args) throws IOException, DocumentException {
        //1.创建文件字节输入流
        FileInputStream fis = new FileInputStream("E:\\DemoXml.xml");
        //2.创建一个只想xml文件的输入流
        SAXReader sr = new SAXReader();
        //3.使用读取工具对象, 读取XML文档的输入流 , 并得到文档对象
        Document doc = sr.read(fis);
        //4.通过文档对象, 获取XML文档中的根元素对象
        Element root = doc.getRootElement();
        List<Element> es = root.elements();
        //System.out.println(root.getName());
        for (int i = 0;i<es.size();i++){
            Element element = es.get(i);
            System.out.println(element.attributeValue("id"));
            System.out.println(element.elementText("name"));
            System.out.println(element.elementText("age"));
            System.out.println("--------------------------");
        }
        //释放资源
        fis.close();
    }
}

解析网络文件案例:

public class DemoBSXml {
    public static void main(String[] args) throws IOException, DocumentException {
        //1.获取地址
        URL url = new URL("http://apis.juhe.cn/mobile/get?phone=18164199665&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
        //2.打开连接
        URLConnection conn = url.openConnection();
        //3.获取网络字节输入流
        InputStream is = conn.getInputStream();
        //4.创建一个XML读取对象SAXReader
        SAXReader sr = new SAXReader();
        //5.SAXReader对象的read方法读取,读取XML数据,并返回文档对象
        Document doc = sr.read(is);
        //6.获取根节点
        Element root = doc.getRootElement();
        //7.解析内容
        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("手机号码有误");
        }

    }
}

JSON

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

对象格式

一本书
书名
简介
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...]

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值