XML与JSON详解(JAVA)

本文详细介绍了XML和JSON的基础知识,包括XML的特性、应用、语法格式以及DOM4J解析XML的方法。同时,文章讲解了JSON的格式以及如何使用GSON和FastJson在JAVA中解析JSON。

XML与JSON详解(JAVA)

1.XML(可拓展标记语言)

注意:XML是一种语言,并不是专表示XML文件

1.1 XML特性

  • 1.XML有平台无关性,是一门独立的标记语言

  • 2.XML具有自我描述性

1.2 XML学习应用

    1. 网络数据传输(良好的可读性,可维护性)

    1. 数据存储(例:qq部分聊天记录)

    1. 配置文件

1.3 XML语法格式

1.3.1 声明(XML文档声明)

注意:一定要写在XML文档的第一行

<?xml version(版本) = "1.0" encoding(编码集) = "UTF-8" ?>

1.3.2 标记(元素/标签/节点)

具体语法是: 开始标记: <标记名称> 结束标记:</标记名称>

注意:标记名称

  1. 不能以数字或标点开始

  2. 名称不能以XML(不管大小写)开始

  3. 名称不能含空格,冒号

  4. 区别大小写

  5. 允许重复

  6. 可以嵌套

正确嵌套:<book>
    <name>肖申克的救赎<id>10001</id></name>
</book>
错误嵌套:<book>
    <name>肖申克的救赎<id>10001</name></id>
</book>

特殊的: 根标记:所有嵌套标记最为外层的标记(文档有且只有一个)

1.3.3 属性

属性在标记开始时,由属性名和属性值组成(都用引号引注),每一个属性都是一个键值对,不能重复,多个属性值用空格分隔。

<book groupId = "77340" type = "05" > (属性)
    <name>肖申克的救赎</name>
    <id>10001</id>
</book>

1.3.4 注释

注释不能写在文档声明前面,不能相互嵌套

格式:

 <!--   注释内容  -->

1.4 Java 如何解析xml

xml 既然作为机器与机器交流的语言,那各大语言就必然支持解析的工具,而java就有两种不同的解析方式,对比如下:

  • SAX解析(按行解读)

优点:

  1. 有助于解析大于系统内存文档

  2. 有时不必解析整个文档便能达到目的

缺点:

  1. 单向解析,无法回档

  2. 无法得知事件时元素层次

  3. 只读,无法进行操作

  • DOM解析(保存读取)

优点:

  1. 允许文档操作

  2. 访问是双向的

缺点:消耗资源大

总结:我们还是毫不犹豫的选择DOM解析方法,因为大多数使用情况我们都需要操作xml,更不用说数据库使用时,还有xml文档一般比较小,保存的都是对象级别,没有底层代码,所以使用DOM解析不会消耗过多的资源,所以上述优缺点不是绝对的,要看使用目的的不同。

1.5 DOM4J解析XML(掌握)

  1. 引入

当使用DOM4J解析xml文档时需要引入一系列 .jar文件 到项目的lib包中

 

再将保存了jar文件的库添加到项目中。

  1. 创建一个指向xml文件的输入流

    FileInputStream fis = new FileInputStream("c://文档//demo.xml");

  2. 创建一个xml读取工具对象

    SAXReader sr = new SAXReader();//这是自己导入的DOM4J中的方法

  3. 使用读取工具对象,读取xml文件输入流并得到文档对象

    Document doc = sr.read(fis); //同上

  4. 通过文档对象,获取xml文档中的根元素对象

    Element root = doc.getRootElement();

  5. 一顿操作猛如虎:

    //操作一波
    System.out.println(root.getName());
    java.util.List<Element> es = root.elements();
    for(int i = 0;i < es.size();i++) {
        Element book = es.get(i);
        System.out.println("该书的编号为:" + book.attributeValue("groupId")
                + " 名字为:" + book.elementText("name")
        + " 类型为: " + book.elementText("id"));
    }
    <?xml version = "1.0" encoding = "UTF-8" ?>
    <books>
    <book groupId = "77340" type = "05" >
        <name>肖申克的救赎</name>
        <id>10001</id>
    </book>
    <book groupId = "77341" type = "04" >
        <name>自卑与超越</name>
        <id>10002</id>
    </book>
    <book groupId = "77342" type = "04" >
        <name>被讨厌的勇气</name>
        <id>10003</id>
    </book>
    <book groupId = "77343" type = "02" >
        <name>国富论</name>
        <id>10004</id>
    </book>
    </books>

    结果为:

    books
    该书的编号为:77340 名字为:肖申克的救赎 类型为: 10001
    该书的编号为:77341 名字为:自卑与超越 类型为: 10002
    该书的编号为:77342 名字为:被讨厌的勇气 类型为: 10003
    该书的编号为:77343 名字为:国富论 类型为: 10004

  6. 网络xml文件的解析也大同小异

    一段利用聚合网站搜索的sml文档做出的小功能

  7. public class WebTest {
        public static void main(String[] args) throws IOException, DocumentException {
    ​
            Scanner scanner = new Scanner(System.in);
            System.out.println("--欢迎来到手机号码查询归属地小程序--");
            System.out.print("请输入你需要查询的手机号:");
            String s = scanner.nextLine();
            URL url = new URL("http://apis.juhe.cn/mobile/get?phone=" + s +
                    "&dtype=xml&key=9f3923e8f87f1ea50ed4ec8c39cc9253");
    ​
            URLConnection conn = url.openConnection();
    ​
            InputStream is = conn.getInputStream();
    ​
            SAXReader sr = new SAXReader();
    ​
            Document read = sr.read(is);
    ​
            Element e1 = read.getRootElement();
    ​
            Element e = e1.element("result");
            System.out.println(e1.getName());
            System.out.println(e1.elementText("reason"));
            System.out.println("该号码的运营商为: " + e.elementText("company"));
            if(e.elementText("province") == e.elementText("city")){
                System.out.println("该号码归属地为: " + e.elementText("city"));
            }
            else{
                System.out.println("该号码归属地为: " + e.elementText("province") + "省 "
                        +e.elementText("city") + "市");
            }
        }
    }
    ​
    
    

1.6.DOM4J的XPATH解析xml文档

1. / : 从根节点查找    2. // : 从发起节点位置,查找后代
3. . : 当前节点   4. .. : 查找父代
5. @ : 选择属性  格式: [@ 属性名 =(> < !) "值" ]
​
eg: //book[@ id = "1" ]//name 查id为1的book的所有name
  

 

XPATH 使用节点的方式来理解和解析xml文档

FileInputStream fis = new FileInputStream("D://demo.xml");
​
SAXReader sr = new SAXReader();
​
Document doc = sr.read(fis);
​
java.util.List<Node> names = doc.selectNodes("//name");
for (int i = 0; i < names.size(); i++) {
    System.out.print(names.get(i).getName());
    System.out.print(names.get(i).getText());
​
}

循环改进式节点输出

JSON(JS对象简谱)

是一种轻量级的数据交换形式

2.1 JSON格式

我们先来看不同语言表示对象的格式:

  1. java

class Book{
    private String name;
    private String id;
    
    get/set
    hashcode/equals
    toString()
}
  1. JS

var b = new Object();
b.name = ("国富论");
b.id = ("10001");
  1. xml

<books>
    <book>
        <name>国富论</name>
        <id>10001</id>
    </book>
</books>

而JSON就是以JS为基础,java思想为辅助,经过相当简化但使用严密的表示对象的语言。

{
    "name":"国富论","id":"10001"
}

2.2 如何解析JSON

GSON 谷歌解析工具

  1. 引入jar包

  2. 转换对象

    //GSON 的 对象转JSON形式
    String json = new Gson().toJson(输入的对象);
    ​
    //输出结果  {"name":"国富论","id":"10001"}

  1. 对象转json

//Json字符串转对象
Book book1 = new Gson().fromJson(json, Book.class);
System.out.println(book1.getId());
System.out.println(book1.getName());
​
​
//10001
//国富论

FastJson 阿里解析工具

public static void main(String[] args) {
    Book book = new Book();
    book.setId("10001");
    book.setName("国富论");
​
    String json = JSON.toJSONString(book);
    System.out.println(json);
    
    Book b = JSON.parseObject(json,Book.class);
}

步骤一致,只是使用的自定义方法有点不同

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值