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输出方式
Groovy中提供了JsonSlurper,调用里面的方法可以进行JSON的反序列化
- def jsonSlurper = new JsonSlurper()
- println jsonSlurper.parseText(json)
注意:如果我们不想使用Groovy中自带的JSON转换工具,也可以通过导入jar包方式,使用其他的JSON转换工具,Groovy完全支持Java中的JSON序列化工具。
解析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
案例:查找所有书籍作者为李刚的书
普通方式
- 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()
- }
借助于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
- }
方法一:使用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
- }
对文件进行写入使用withWriter方法
- def file = new File('test.txt')
- def writer = file.withWriter { write ->
- def Test = "我爱Java"
- def buffer = Test.getBytes()
- write.write(buffer)
- return buffer
- }
- 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中调用它的文件操作方法,不需要关闭流,因为它的这个方法中已经设置了流的关闭操作。
借助于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
- }
借助于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
- }