• Groovy之高级用法


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

    1.1、将数据转为JSON 

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

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

    1.2、将JSON转为原始数据

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

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

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

    2、xml文件的解析和创建

    2.1、 解析xml

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

    1. final String xml = '''
    2. <response version-api="2.0">
    3. <value>
    4. <books id="1" classification="android">
    5. <book available="20" id="1">
    6. <title>疯狂Android讲义</title>
    7. <author id="1">李刚</author>
    8. </book>
    9. <book available="14" id="2">
    10. <title>第一行代码</title>
    11. <author id="2">郭林</author>
    12. </book>
    13. <book available="13" id="3">
    14. <title>Android开发艺术探索</title>
    15. <author id="3">任玉刚</author>
    16. </book>
    17. <book available="5" id="4">
    18. <title>Android源码设计模式</title>
    19. <author id="4">何红辉</author>
    20. </book>
    21. </books>
    22. <books id="2" classification="web">
    23. <book available="10" id="1">
    24. <title>Vue从入门到精通</title>
    25. <author id="4">李刚</author>
    26. </book>
    27. </books>
    28. </value>
    29. </response>
    30. '''
    31. // 解析xml
    32. def xmlSluper = new XmlSlurper()
    33. def response = xmlSluper.parseText(xml)
    34. println response.value.books[0].book[0].title.text() // 疯狂Android讲义
    35. println response.value.books[1].book[0].@available // 10

    2.2、xml文件的遍历

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

    普通方式

    1. def list = []
    2. response.value.books.each { books ->
    3. // 下面对书节点进行遍历
    4. books.book.each { book ->
    5. def author = book.author.text()
    6. if (author.equals("李刚")) {
    7. list.add(book.title.text())
    8. }
    9. }
    10. }

    Groovy中的深度递归遍历方式

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

    Groovy中的广度递归遍历方式

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

    2.3、xml文件的创建

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

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

    动态生成xml数据

    1. def sw = new StringWriter();
    2. def xmlBuilder = new MarkupBuilder(sw) // 用来生成xml数据的核心类
    3. def langs = new Langs()
    4. xmlBuilder.langs(type: langs.type, count: langs.count,
    5. mainstream: langs.mainstream) {
    6. //遍历所有的子结点
    7. langs.languages.each { lang ->
    8. language(flavor: lang.flavor,
    9. version: lang.version, lang.value)
    10. }
    11. }
    12. println sw
    13. //对应xml中的langs结点
    14. class Langs {
    15. String type = 'current'
    16. int count = 3
    17. boolean mainstream = true
    18. def languages = [
    19. new Language(flavor: 'static',
    20. version: '1.5', value: 'Java'),
    21. new Language(flavor: 'dynamic',
    22. version: '1.3', value: 'Groovy'),
    23. new Language(flavor: 'dynamic',
    24. version: '1.6', value: 'JavaScript')
    25. ]
    26. }
    27. //对应xml中的languang结点
    28. class Language {
    29. String flavor
    30. String version
    31. String value
    32. }

    3、文件操作 

    3.1、读取文件

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

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

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

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

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

    def result = file.readLines() 

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

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

    3.2、文件的写入

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

    1. def file = new File('test.txt')
    2. def writer = file.withWriter { write ->
    3. def Test = "我爱Java"
    4. def buffer = Test.getBytes()
    5. write.write(buffer)
    6. return buffer
    7. }

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

    1. def copy(String sourcePath, String destationPath) {
    2. try {
    3. // 首先创建目标文件
    4. def desFile = new File(destationPath)
    5. if (!desFile.exists()) {
    6. desFile.createNewFile()
    7. }
    8. // 开始copy
    9. new File(sourcePath).withReader { reader ->
    10. def lines = reader.readLines()
    11. desFile.withWriter() { writer ->
    12. lines.each { line ->
    13. writer.append(line + "\r\n")
    14. }
    15. }
    16. }
    17. return true
    18. } catch (Exception e) {
    19. e.printStackTrace()
    20. }
    21. return false
    22. }
    23. // Groovy中调用它的文件操作方法,不需要关闭流,因为它的这个方法中已经设置了流的关闭操作。

    4、对象的写入与读取、

    4.1、将对象写入到文件

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

    1. def saveObject(Object object, String path) {
    2. try {
    3. // 首先创建目标文件
    4. def desFile = new File(path)
    5. if (!desFile.exists()) {
    6. desFile.createNewFile()
    7. }
    8. desFile.withObjectOutputStream { out ->
    9. out.writeObject(object) // 将对象写入文件
    10. }
    11. return true
    12. } catch (Exception e) {
    13. }
    14. return false
    15. }

    4.2、从文件中读取对象

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

    1. def readObject(String path) {
    2. def obj = null
    3. try {
    4. def file = new File(path)
    5. if (file == null || !file.exists()) return null
    6. // 从文件中读取对象
    7. file.withObjectInputStream { input ->
    8. obj = input.readObject()
    9. }
    10. } catch (Exception e) {
    11. }
    12. return obj
    13. }

  • 相关阅读:
    【前端小点】ElementUI-Dialog标题添加图标
    低代码平台前端的设计与实现(四)组件大纲树的构建设计
    LeetCode 算法:全排列 c++
    Verilog 过程结构(initial, always)
    由x-www-form-urlencoded引发的接口对接失败
    TRITC-透明质酸,TRITC-hyaluronic acid,四甲基罗丹明标记透明质酸
    huggingface使用bert
    【计算机网络笔记】Cookie技术
    免费小程序商城搭建之b2b2c o2o 多商家入驻商城 直播带货商城 电子商务b2b2c o2o 多商家入驻商城 直播带货商城 电子商务
    Node学习十四 —— 使用node创建HTTP请求
  • 原文地址:https://blog.csdn.net/weixin_52851967/article/details/125446250