Java高级文本处理(1)

XML简介与解析

数据是主体
• 但是,单独的数据,它的含义很模糊
数据+含义,适用于传输数据,而不是显示数据(HTML)
example:

在这里插入图片描述
XML其实就是纯文本的表示

  1. 跨系统,平台,语言
  2. 核心就是意义+数据
    W3C官网

取自W3C的一个书店示例
在这里插入图片描述注意:
– 需要转义字符,如“<”需要用:“&lt”;(无引号)代替。
– 注释:XML Schema(XSD,XML Schema Definition)
– 定义 XML 文档的结构, DTD的继任者(DTD不做介绍了)
– 支持数据类型,可扩展,功能更完善、强大
– 采用xml编写

在这里插入图片描述XSL
– 扩展样式表语言(eXtensible Stylesheet Language)
– XSL作用于XML,等同于CSS作用于HTML
可访问W3C官网学习XML

XML的解析

– 树结构
• DOM: Document Object Model 文档对象模型,擅长(小规模)读/写

– 流结构
• SAX: Simple API for XML 流机制解释器(推模式),擅长读
• Stax: The Streaming API for XML 流机制解释器(拉模式),擅长读,
JDK 6 引入

DOM
W3C 处理 XML 的标准 API

  • 直观易用
  • 但处理大量数据·时候有程序崩溃的风险
    这一部分的内容没有上过,可课下自行了解

JSON简介

  • JS对象的表示方法
  • 比XML更加容易解析
  • 推广到全部的语言(尽管它本身为JS的语法格式)

JSON是一种独立于编程语言的、轻量的、数据交换格式

JSON对象和JSON数组
• 名称/值对(K-V对)。
如"firstName":“John”
– JSON对象:{“name":“Jo”,“email”:“a@b.com”}
– 数据在键值对中
– 数据由逗号分隔
花括号保存对象
• JSON数组
– 方括号保存数组
[{“name":“Jo”,“email”:“a@b.com”}, {“name":“Jo”,“email”:“a@b.com”}]

Java的JSON处理方法
• org.json:JSON官方推荐的解析类
– 简单易用,通用性强
– 复杂功能欠缺

• GSON:Google出品
– 基于反射,可以实现JSON对象、JSON字符串和Java对象互转

• Jackson:号称最快的JSON处理器
– 简单易用,社区更新和发布速度比较快

综上考虑,Google的GSON更加好用

JSON和XML
• 都是数据交换格式,可读性强,可扩展性高
• 大部分的情况下,JSON更具优势(编码简单,转换方便),
而且JSON字符长度一般小于XML,传输效率更高
XML更加注重标签和顺序
JSON会丢失信息

相互转化标签的顺序可能会发生改变

只说一下GSON,其他两个具体可自行查早他们的文档阅读

文件目录
在这里插入图片描述pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>Java MOOC</groupId>
    <artifactId>GSON</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.7</version>
    </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

books2.json

[
    {
        "category": "COOKING",
        "title": "Everyday Italian",
        "author": "Giada De Laurentiis",
        "year": "2005",
        "price": 30
    },
    {
        "category": "CHILDREN",
        "title": "Harry Potter",
        "author": "J K. Rowling",
        "year": "2005",
        "price": 29
    },
    {
        "category": "WEB",
        "title": "Learning XML",
        "author": "Erik T. Ray",
        "year": "2003",
        "price": 39
    }
]

//Book.class
public class Book {
    private String category;
    private String title;
    private String author;
    private String year;
    private int price;

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getTitle(){
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
    public String getAuthor(){
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getYear() {
        return year;
    }

    public int getPrice() {
        return price;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public void setPrice(int price) {
        this.price = price;
    }
    @Override
    public String toString(){
        return "Book[category="+category+",title="+title+",author="+author+",year="+year+",price="+price+"]";
    }
}
//Person.class
import java.util.List;

public class Person{
    private String name;
    private int age;
    private List<Integer> scores;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setScores(List<Integer> scores) {
        this.scores = scores;
    }
    public List<Integer> getScores() {
        return scores;
    }
}
//***GsonTest.class
import java.io.File;
import java.io.FileReader;
import java.util.Arrays;
import java.util.List;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.reflect.TypeToken;

public class GsonTest{
    public static void main(String[] args) {
        testJsonObject();
        System.out.println("=========华丽丽的分割线哦================");
        testJsonFile();
    }
    public static void testJsonObject(){
        //构造函数
        Person p=new Person();
        p.setName("Gary");
        p.setAge(20);
        p.setScores(Arrays.asList(60,70,80));//调用setScore

        //1.从Java对象到JSON字符串
        Gson gson=new Gson();
        String s=gson.toJson(p);//Person对象到Json字符串
        System.out.println(s);

        //2.反过来,Gson字符串到Java对象
        Person p2=gson.fromJson(s,Person.class);
        System.out.println(p2.getName());//Gary
        System.out.println(p2.getAge());//20
        System.out.println(p2.getScores());//60,70,80

        //调用Gson的JsonObject
        JsonObject json=gson.toJsonTree(p).getAsJsonObject();//像整个json解析为一棵树
        System.out.println(json.get("name"));//Gary
        System.out.println(json.get("age"));
        System.out.println(json.get("scores"));
    }

    public static void testJsonFile(){
        Gson gson=new Gson();
        File file=new File("books2.json");
        try(FileReader reader=new FileReader(file)){
            List<Book>books=gson.fromJson(reader,new TypeToken<List<Book>>(){}.getType());//Json文件带Java对象数组(这就是GSON的强大的地方)
            for(Book book:books)
            {
                System.out.println(book.getAuthor()+" ,"+book.getTitle());
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值