Groovy之高级用法

1、JSON的序列化与反序列化

1.1、将数据转为JSON 

Groovy中提供了JsonOutput这个类,调用里面的方法,可以帮我们将数据转为JSON

def list = [new Person(name: 'John', age: 25),
            new Person(name: 'Jack', age: 18)]
// println JsonOutput.toJson(list) // 将列表转为json
def json = JsonOutput.toJson(list)
println JsonOutput.prettyPrint(json) // 带格式的JSON输出方式

1.2、将JSON转为原始数据

Groovy中提供了JsonSlurper,调用里面的方法可以进行JSON的反序列化

def jsonSlurper = new JsonSlurper()
println jsonSlurper.parseText(json)

注意:如果我们不想使用Groovy中自带的JSON转换工具,也可以通过导入jar包方式,使用其他的JSON转换工具,Groovy完全支持Java中的JSON序列化工具。

2、xml文件的解析和创建

2.1、 解析xml

解析xml文件需要使用Groovy中的XmlSlurper工具类,它极大地简化了Java中xml读取方法。

final String xml = '''
    <response version-api="2.0">
        <value>
            <books id="1" classification="android">
                <book available="20" id="1">
                    <title>疯狂Android讲义</title>
                    <author id="1">李刚</author>
                </book>
                <book available="14" id="2">
                   <title>第一行代码</title>
                   <author id="2">郭林</author>
               </book>
               <book available="13" id="3">
                   <title>Android开发艺术探索</title>
                   <author id="3">任玉刚</author>
               </book>
               <book available="5" id="4">
                   <title>Android源码设计模式</title>
                   <author id="4">何红辉</author>
               </book>
           </books>
           <books id="2" classification="web">
               <book available="10" id="1">
                   <title>Vue从入门到精通</title>
                   <author id="4">李刚</author>
               </book>
           </books>
       </value>
    </response>
'''

// 解析xml
def xmlSluper = new XmlSlurper()
def response = xmlSluper.parseText(xml)

println response.value.books[0].book[0].title.text() // 疯狂Android讲义
println response.value.books[1].book[0].@available // 10

2.2、xml文件的遍历

案例:查找所有书籍作者为李刚的书

普通方式

def list = []
response.value.books.each { books ->
    // 下面对书节点进行遍历
    books.book.each { book ->
        def author = book.author.text()
        if (author.equals("李刚")) {
            list.add(book.title.text())
        }
    }
}

Groovy中的深度递归遍历方式

// groovy中为我们提供了递归深度遍历方法,极大地简化了代码
def titles = response.depthFirst().findAll { book -> // depthFirst()还可以使用"**"代替
    return book.author.text() == '李刚' ? true : false
}

Groovy中的广度递归遍历方式

// 广度遍历xml
def name = response.value.books.children().findAll { node ->  // children方法可以用操作符'*'代替, def name = response.value.books.'*'.findAll
    node.name() == 'book' && node.@id == '2' // 查找节点名称为book且id=2的书籍
}.collect { node ->
    return node.title.text()
}

2.3、xml文件的创建

借助于Groovy中的MarkupBuilder核心类,调用里面的方法,进行xml格式数据的生成

/**
 * 生成xml格式数据
 * <langs type='current' count='3' mainstream='true'>
 <language flavor='static' version='1.5'>Java</language>
 <language flavor='dynamic' version='1.6.0'>Groovy</language>
 <language flavor='dynamic' version='1.9'>JavaScript</language>
 </langs>
 */
def sw = new StringWriter();
def xmlBuilder = new MarkupBuilder(sw) // 用来生成xml数据的核心类
// 创建根节点langs
xmlBuilder.langs(type: 'current', count: '3', mainstream: 'true') {
    // 创建子节点language
    language(flavor: 'static',version:'1.5','Java') // 不指定属性名,就代表节点的值
    language(flavor: 'dynamic',version:'1.6.0','Groovy')
    language(flavor: 'dynamic',version:'1.9','JavaScript')
}
println sw

动态生成xml数据

def sw = new StringWriter();
def xmlBuilder = new MarkupBuilder(sw) // 用来生成xml数据的核心类
def langs = new Langs()
xmlBuilder.langs(type: langs.type, count: langs.count,
        mainstream: langs.mainstream) {
    //遍历所有的子结点
    langs.languages.each { lang ->
        language(flavor: lang.flavor,
                version: lang.version, lang.value)
    }
}
println sw

//对应xml中的langs结点
class Langs {
    String type = 'current'
    int count = 3
    boolean mainstream = true
    def languages = [
            new Language(flavor: 'static',
                    version: '1.5', value: 'Java'),
            new Language(flavor: 'dynamic',
                    version: '1.3', value: 'Groovy'),
            new Language(flavor: 'dynamic',
                    version: '1.6', value: 'JavaScript')
    ]
}
//对应xml中的languang结点
class Language {
    String flavor
    String version
    String value
}

3、文件操作 

3.1、读取文件

方法一:使用eachLine方法遍历读取文件

def file = new File('xmlStudy.groovy')
file.eachLine {line ->
     println line
 }

方式二:使用getText方法获取文件全部内容

def text = file.getText()  // 获取文件内容
println text

方式三:使用readLines方法把读取到的文件放入list列表中

def result = file.readLines() 

方式四:借助withReader方法读取文件部分内容

def file = new File('test.txt')
def reader = file.withReader { reader ->
    char[] buffer = new char[100]
    reader.read(buffer)
    return buffer
}

3.2、文件的写入

对文件进行写入使用withWriter方法

def file = new File('test.txt')
def writer = file.withWriter { write ->
    def Test = "我爱Java"
    def buffer = Test.getBytes()
    write.write(buffer)
    return buffer
}

3.3、文件拷贝(读写相结合)

def copy(String sourcePath, String destationPath) {
    try {
        // 首先创建目标文件
        def desFile = new File(destationPath)
        if (!desFile.exists()) {
            desFile.createNewFile()
        }

        // 开始copy
        new File(sourcePath).withReader { reader ->
            def lines = reader.readLines()
            desFile.withWriter() { writer ->
                lines.each { line ->
                    writer.append(line + "\r\n")
                }
            }
        }
        return true
    } catch (Exception e) {
        e.printStackTrace()
    }
    return false
}
// Groovy中调用它的文件操作方法,不需要关闭流,因为它的这个方法中已经设置了流的关闭操作。

4、对象的写入与读取、

4.1、将对象写入到文件

借助于withObjectOutputStream方法,我们可以将对象写入到文件中去

def saveObject(Object object, String path) {
    try {
        // 首先创建目标文件
        def desFile = new File(path)
        if (!desFile.exists()) {
            desFile.createNewFile()
        }
        desFile.withObjectOutputStream { out ->
            out.writeObject(object) // 将对象写入文件
        }
        return true
    } catch (Exception e) {
    }
    return false
}

4.2、从文件中读取对象

借助于withObjectInputStream方法,我们可以将对象从文件中读取出来

def readObject(String path) {
    def obj = null
    try {
        def file = new File(path)
        if (file == null || !file.exists()) return null
        // 从文件中读取对象
        file.withObjectInputStream { input ->
            obj = input.readObject()
        }
    } catch (Exception e) {

    }
    return obj
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悠然予夏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值