Gradle实战-05-Gradle高级语法

一、概要

本篇主要讲的是在Gradle中对Json、XML 文件的解析处理和输出,以及文件的读和写操作,因为这些操作对于后面的 Android 高级开发是有帮助的,比如帮助统计版本信息等。

二、实战

一、Gradle中的JSON使用

注意:在使用之前加上Gson的lib库,添加第三方jar gson-2.7.jar,在项目根目录创建libs目录 --> gson.jar -> 右键 add as Library。

Gradle实战-05-Gradle高级语法_第1张图片

package advance

import com.google.gson.Gson
import groovy.json.JsonOutput
import groovy.json.JsonSlurper
import oop.Person

//groovy json 操作
//groovy xml文件操作详解
//groovy 文件操作
//groovy与Java对比及总结

def list = [new Person(name: 'lily', age: 24),
            new Person(name: 'John', age: 25)]

//Gson来创建json
//添加第三方jar gson-2.7.jar
//在项目根目录创建libs目录 --> gson.jar -> 右键 add as Library
def gson = new Gson()
//[{"name":"lily","age":24},{"name":"John","age":25}]
println gson.toJson(list)

def json = JsonOutput.toJson(list)
//[{"age":24,"name":"lily"},{"age":25,"name":"John"}]
println json
//更加漂亮的打印输出
//println JsonOutput.prettyPrint(json)

//解析成JSON对象
//def jsonSluper = new JsonSlurper()
//jsonSluper.parse()

//请求网络数据
def weatherUrl = 'https://www.mxnzp.com/api/weather/current/%E6%B7%B1%E5%9C%B3%E5%B8%82?app_id=jquvkfnwqfxmgnlp&app_secret=NzBtQ3ozM2hqWjFNN3FmTTZGK0h3UT09'
def response = getNetWorkData(weatherUrl)
//[code:1, msg:数据返回成功!, data:[address:广东省 深圳市, cityCode:440300, temp:27℃, weather:阴, windDirection:东北, windPower:≤3级, humidity:88%, reportTime:2021-06-25 09:30:08]]
println response.data.address
println response.data.temp


def getNetWorkData(String url){
    //发送Http请求
    def connection = new URL(url).openConnection()
    connection.setRequestMethod('GET')
    connection.connect()
    def response = connection.content.text

    //将json转化成实体对象
    def jsonSluper = new JsonSlurper()
    return jsonSluper.parseText(response)
}

二、Groovy中xml文件操作

1. xml文件解析

import groovy.xml.XmlSlurper

//xml文件解析
//java如何处理xml文件
//java xml处理 DOM文档驱动处理 2. 事件驱动处理
//groovy中如何解析一个xml格式数据
//groovy中如何创建一个xml数据文件

final String xml = '''
   
      
          
            
                疯狂Android讲义
                李刚
            
            
                第一行代码
                郭霖
            
            
                Android开发艺术探索
                任玉刚
            
             
                Android设计模式
                任玉刚
            
           
                Vue的学习
                李刚
            
          
      
   
'''

//开始解析xml 数据

def xmlSluper = new XmlSlurper()
def response = xmlSluper.parseText(xml)

//疯狂Android讲义
println response.value.books.book[0].title.text()
//取出book节点的available属性  属性的值是 20
println response.value.books[0].book[0].@available

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())
        }
    }
}
println list.toListString()

3. 深度遍历和广度遍历

//深度遍历
def titles = response.depthFirst().findAll { book->
    return book.author.text() == '李刚'
}

//这是把整个对象都打印出来了
println titles.toListString() //[疯狂Android讲义李刚, Vue的学习李刚]

//广度遍历
def names = response.value.books.children().findAll { node->
    return node.name() == 'book' && node.@id == '2'
}.collect {
    node-> return node.title.text()
}

println names.toListString() //[第一行代码]

4. 创建xml格式字符串

//生成xml格式数据
def rawXml  = '''
 
     Java   
     Groovy   
     Script   

'''

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'){
        age('16')
    }
    language(flavor:'dynamic', version:'1.6.0'){
        age('10')
    }
    language(flavor:'dynamic', version:'1.9', 'Script')
}

println sw

输出结果:

//打印输出

  
    16
  
  
    10
  
  Script

5. 根据对象来创建xml格式数据

def sw = new StringWriter()
def xmlBuilder = new MarkupBuilder(sw)
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.6', value:'Java'),
            new Language(flavor: 'dynamic', version: '1.5', value:'Groovy'),
            new Language(flavor: 'dynamic', version: '1.3', value:'JavaScript'),
    ]
}

//对应xml中的language节点
class Language {
    String flavor
    String version
    String value
}

输出结果:

//打印输出

  Java
  Groovy
  JavaScript

三、文件操作

所有Java对文件的操作,使用 groovy 都可以实现,而且 groovy 扩展了许多更加快捷和强大的方法。

遍历文件的每行内容 

def file = new File('../../Groovy-02.iml')
//遍历文件的每行内容
file.eachLine {line ->
    println line
}

一次性输出文件的所有内容

//完整的获取文本内容
def text = file.getText()
println text

获取文件内容的所有行内容

def result = file.readLines()
result.each {line->
    println "$line"
}

读取指定个数的字符内容

//只读取100个字符,并放入buffer中,最后返回buffer
def reader = file.withReader {
    reader ->
        char[] buffer = new char[100]
        reader.read(buffer)
        return buffer
}

println reader

文件的读写拷贝

def result = copy('../../Groovy-02.iml', '../../Groovy-03.iml')
println result

//文件的读和写
def copy(String sourcePath, String destinationPath) {
    try {
        //1. 首先创建目标文件
        def destFile = new File(destinationPath)
        if (!destFile.exists()) {
            //如果目标文件不存在,则创建目标文件
            destFile.createNewFile()
        }
        //2. 开始拷贝
        new File(sourcePath).withReader {
            reader ->
                //通过reader获取到所有的内容
                def lines = reader.readLines()
                destFile.withWriter {
                    writer ->
                        lines.each {
                            line -> writer.append(line + "\r\n")
                        }
                }
        }
        return true
    } catch (Exception e) {
        e.printStackTrace()
    }
    return false
}

对象写入和读取

//将对象写入到文件,然后从文件中读取对象
//Person需要显示Serializable接口
def person = new Person(name: 'lisi', age: 28)
saveObject(person, '../../person.bin')
def personRead = (Person)readObject('../../person.bin')
println "the name is ${personRead.name}, the age is $personRead.age"


//对象读写
def saveObject(Object object, String path) {
    try {
        //1. 首先创建目标文件
        def destFile = new File(path)
        if (!destFile.exists()) {
            destFile.createNewFile()
        }
        //针对不同的对象创建不同的输出流
        destFile.withObjectOutputStream {out-> out.writeObject(object)}
        return true
    } catch (Exception e) {
        e.printStackTrace()
    }
    return false
}

def readObject(String path){
    def obj = null
    try {
        //1. 首先创建目标文件
        def destFile = new File(path)
        if (destFile== null ||!destFile.exists()) {
           return null
        }
        //从文件中读取对象
        destFile.withObjectInputStream {
            input-> obj = input.readObject()
        }
        return obj
    }catch(Exception e){
        e.printStackTrace()
    }
    return null
}

//输出
the name is lisi, the age is 28

你可能感兴趣的:(#,Gradle学习,gradle,json,java)