Groovy操作JSON和XML及对文件的处理

文章目录

      • 1Groovy对Json的操作
        • 1.1 Groovy自带工具处理Json
        • 1.2 使用java第三方类库gson处理json
      • 2 Groovy对xml的操作
        • 2.1 对象转换成xml
        • 2.2 xml转换成对象
      • 3 Groovy操作文件
        • 3.1 文本文件操作
        • 3.2 对象写入文件和从文件中读出

1Groovy对Json的操作

1.1 Groovy自带工具处理Json

Groovy中自带能将字符串转换为json的工具包groovy.json.JsonSlurper,也带有将对象转换为json字符串的包groovy.json.JsonOutput。我们在下面的例子中编写代码来进行测试:

package com.dream21th.json

import groovy.json.JsonOutput
import groovy.json.JsonSlurper
import groovy.json.StringEscapeUtils

def person = new Person(name: "张三丰",age:29)
def personString=JsonOutput.toJson(person)
println(personString)//{"age":29,"name":"\u5f20\u4e09\u4e30"}
println(personString.class)//class java.lang.String

//将Unicode转为中文
def str= StringEscapeUtils.unescapeJava(personString)
println(str)//{"age":29,"name":"张三丰"}
//将中文转为Unicode
//StringEscapeUtils.escapeJava(str)


def personList=[
        new Person(name: "张三丰",age:29),
        new Person(name: "里斯",age:19),
        new Person(name: "王明",age:18),
        new Person(name: "无缘",age:29)
]

def personListString=JsonOutput.toJson(personList)
println(personListString)//[{"age":29,"name":"\u5f20\u4e09\u4e30"},{"age":19,"name":"\u91cc\u65af"},{"age":18,"name":"\u738b\u660e"},{"age":29,"name":"\u65e0\u7f18"}]
//将Unicode转为中文
println(StringEscapeUtils.unescapeJava(personListString))//[{"age":29,"name":"张三丰"},{"age":19,"name":"里斯"},{"age":18,"name":"王明"},{"age":29,"name":"无缘"}]


def personStr='{"age":39,"name":"李莉"}'
def js=new JsonSlurper()
def p =(Person) (js.parseText(personStr))
println(p)//name:李莉,age:39
println(p.class)//class com.dream21th.json.Person

def listStr='[{"age":29,"name":"张三丰"},{"age":19,"name":"里斯"},{"age":18,"name":"王明"},{"age":29,"name":"无缘"}]'
def list1=js.parseText(listStr)
println(list1)//[[age:29, name:张三丰], [age:19, name:里斯], [age:18, name:王明], [age:29, name:无缘]]
println(list1.class)//class java.util.ArrayList

​ 通过上面代码的运行,可以知道Groovy中的自带json工具的使用方式,同时要注意的是,Groovy自带工具在将汉字转换的时候会出现Unicode编码,如果需要转换成中文的话还需要使用StringEscapeUtils.escapeJava方法。下图是上述代码运行时控制台的输出内容:

在这里插入图片描述

1.2 使用java第三方类库gson处理json

​ 通过上面对Groovy自带json包对json的处理,发现使用起来还是不是特别方便,比较明显的就是中文会出现Unicode编码,将json字符串转成对象的时候要在前面加上强制类型转换。这些问题可以使用第三方的包gson来避免。

gson包的下载地址: https://repo1.maven.org/maven2/com/google/code/gson/gson/2.9.0/

在这里插入图片描述

​ 下载完成之后,将包放到项目的libs目录下面,按照下面的操作将包加入到项目中,选中包点击鼠标右键,选中Add as Library

在这里插入图片描述

​ 第三方包依赖完成之后,编写下面代码进行测试,从输出结果来看得到同样的输出代码比Groovy自带json包简单:

package com.dream21th.json

import com.google.gson.Gson

def person = new Person(name: "张三丰",age:29)
def gson=new Gson()
def personString = gson.toJson(person)
println(personString)//{"name":"张三丰","age":29}
println(personString.class)//class java.lang.String

def personStr='{"age":39,"name":"李莉"}'
def p =gson.fromJson(personStr,Person.class)
println(p)//name:李莉,age:39
println(p.class)//class com.dream21th.json.Person

def listStr='[{"age":29,"name":"张三丰"},{"age":19,"name":"里斯"},{"age":18,"name":"王明"},{"age":29,"name":"无缘"}]'
def list1=gson.fromJson(listStr,List.class)
println(list1)//[[age:29, name:张三丰], [age:19, name:里斯], [age:18, name:王明], [age:29, name:无缘]]
println(list1.class)//class java.util.ArrayList

2 Groovy对xml的操作

Groovy自带了对xml的处理工具,将对象转换为xml的工具groovy.xml.MarkupBuilder,将xml转换为对象的处理工具groovy.xml.XmlSlurper,下面我们编写一个例子,将对象转换为xml

2.1 对象转换成xml

​ 首先,定义一个Student的类,该类的具体定义信息如下:

package com.dream21th.xml

class Student {

    int id

    String name

    int age

    String sex

    String phone

    String address

    //方便打印输出
    @Override
    String toString() {
        return "name:"+this.name+",age:"+this.age
    }
}

​ 将对象转换成xml的代码如下:

package com.dream21th.xml

import groovy.xml.MarkupBuilder

def sw=new StringWriter()
def mb=new MarkupBuilder(sw)

def list=[
        new Student(id: 1,name: "张三",age: 18,phone: "13971117777",sex: "男",address: "上海时浦东新区"),
        new Student(id: 2,name: "里斯",age: 19,phone: "13971117777",sex: "男",address: "上海时黄埔"),
        new Student(id: 3,name: "王五",age: 17,phone: "13971117777",sex: "男",address: "上海时嘉定"),
        new Student(id: 4,name: "张敏",age: 18,phone: "13971117777",sex: "女",address: "上海时普陀"),
        new Student(id: 5,name: "丽丽",age: 18,phone: "13971117777",sex: "男",address: "上海时杨浦"),
        new Student(id: 6,name: "王浩",age: 18,phone: "13971117777",sex: "男",address: "上海时浦东新区")
]

def stuStr="students"
mb."${stuStr}"(){
    for (stu in list){
        student(id: stu.id){//student节点标签里面会有一个id,如<student id='1'>
            name(desc:"姓名",stu.name)//name节点标签里面会有一个desc,还有一个值 <name desc='姓名'>张三</name>
            age(value:stu.age)//age节点标签里面有一个value
            phone(stu.phone)
            sex(stu.sex)
            address(stu.address)
        }
    }
}

println(sw) //输出转换成xml后的

​ 将对象转换成xml,在节点中可以定义属性(Student节点中的id),也可以只定义值(phone(stu.phone)),也可以两者都定义name(desc:"姓名",stu.name),上述代码的输出结果信息如下:

<students>
  <student id='1'>
    <name desc='姓名'>张三</name>
    <age value='18' />
    <phone>13971117777</phone>
    <sex></sex>
    <address>上海时浦东新区</address>
  </student>
  <student id='2'>
    <name desc='姓名'>里斯</name>
    <age value='19' />
    <phone>13971117777</phone>
    <sex></sex>
    <address>上海时黄埔</address>
  </student>
  <student id='3'>
    <name desc='姓名'>王五</name>
    <age value='17' />
    <phone>13971117777</phone>
    <sex></sex>
    <address>上海时嘉定</address>
  </student>
  <student id='4'>
    <name desc='姓名'>张敏</name>
    <age value='18' />
    <phone>13971117777</phone>
    <sex></sex>
    <address>上海时普陀</address>
  </student>
  <student id='5'>
    <name desc='姓名'>丽丽</name>
    <age value='18' />
    <phone>13971117777</phone>
    <sex></sex>
    <address>上海时杨浦</address>
  </student>
  <student id='6'>
    <name desc='姓名'>王浩</name>
    <age value='18' />
    <phone>13971117777</phone>
    <sex></sex>
    <address>上海时浦东新区</address>
  </student>
</students>
2.2 xml转换成对象

​ 接下来,我们将上面转换的xml解析出来,编写下面代码:

package com.dream21th.xml

import groovy.xml.XmlSlurper

def xml='''
<students>
  <student id='1'>
    <name desc='姓名'>张三</name>
    <age value='18' />
    <phone>13971117777</phone>
    <sex>男</sex>
    <address>上海时浦东新区</address>
  </student>
  <student id='2'>
    <name desc='姓名'>里斯</name>
    <age value='19' />
    <phone>13971117777</phone>
    <sex>男</sex>
    <address>上海时黄埔</address>
  </student>
  <student id='3'>
    <name desc='姓名'>王五</name>
    <age value='17' />
    <phone>13971117777</phone>
    <sex>男</sex>
    <address>上海时嘉定</address>
  </student>
  <student id='4'>
    <name desc='姓名'>张敏</name>
    <age value='18' />
    <phone>13971117777</phone>
    <sex>女</sex>
    <address>上海时普陀</address>
  </student>
  <student id='5'>
    <name desc='姓名'>丽丽</name>
    <age value='18' />
    <phone>13971117777</phone>
    <sex>男</sex>
    <address>上海时杨浦</address>
  </student>
  <student id='6'>
    <name desc='姓名'>王浩</name>
    <age value='18' />
    <phone>13971117777</phone>
    <sex>男</sex>
    <address>上海时浦东新区</address>
  </student>
</students>
'''

def xs = new XmlSlurper()
def students=xs.parseText(xml)
//获取第一个student节点的name的值
println(students.student[0].name.text())//张三

//获取第二个student节点的age节点的value属性值
println(students.student[1].age.@value)//19


students.student.each{
    stu -> printf("student@id:%s name:%s name@desc:%s age@value:%s phone:%s sex:%s address:%s\n",stu.@id,stu.name.text(),stu.name.@desc,stu.age.@value,stu.phone.text(),stu.sex.text(),stu.address.text())
}

​ 代码运行后的输出结果:

student@id:1 name:张三 name@desc:姓名 age@value:18 phone:13971117777 sex:男 address:上海时浦东新区
student@id:2 name:里斯 name@desc:姓名 age@value:19 phone:13971117777 sex:男 address:上海时黄埔
student@id:3 name:王五 name@desc:姓名 age@value:17 phone:13971117777 sex:男 address:上海时嘉定
student@id:4 name:张敏 name@desc:姓名 age@value:18 phone:13971117777 sex:女 address:上海时普陀
student@id:5 name:丽丽 name@desc:姓名 age@value:18 phone:13971117777 sex:男 address:上海时杨浦
student@id:6 name:王浩 name@desc:姓名 age@value:18 phone:13971117777 sex:男 address:上海时浦东新区

​ 通过上面例子,可以发现在解析属性的时候有@+属性值,解析值的时候用值的text方法即可。

3 Groovy操作文件

3.1 文本文件操作

​ 可以在Groovy中对文件进行操作,一次读取文件的所有内容,每次读取一行内容,读取指定字符长度的数据,复制文件的操作,具体代码实现如下:

package com.dream21th.file

def file=new File("./20240103.xml")
file.eachLine {it-> println(it)} //打印文件中的每行内容

def strAll=file.getText() //获取文件中的所有内容
println(strAll)
println(strAll.class)

def list = file.readLines() //将文件中的内容按照行全部读出来放到列表里面

for(line in list){
    println(line)
}

//读取200个字符
def bufenStr=file.withReader {
    def buffer = new char[200]
    it.read(buffer)
    return buffer
}
println(bufenStr)

//复制文件
def copy(String sourcePath,String destPath){
    def destFile=new File(destPath)
    if(!destFile.exists()){
        //如果文件不存在就创建一个文件
        destFile.createNewFile()
    }

    new File(sourcePath).withReader {
        def lines=it.readLines()
        destFile.withWriter {
            lines.each {line->
                it.append(line+"\r\n")
            }
        }
    }
    return true
}

copy("./20240103.xml","./20240103001.xml")
3.2 对象写入文件和从文件中读出

​ 有时候,我们可能需要将对象存到文件里面后面在取出来使用,那么就可以采用本部分的内容,需要存储的对象的类需要序列化也就是要实现Serializable接口。本次代码展示的类信息如下:

package com.dream21th.file

class Student implements Serializable {

    int id

    String name

    int age

    String sex

    String phone

    String address

    //方便打印输出
    @Override
    String toString() {
        return "name:"+this.name+",age:"+this.age
    }
}

​ 下面操作时将对象存到文件:

def saveObject(Object object,String path){
    def destFile=new File(path)
    if(!destFile.exists()){
        //如果文件不存在就创建一个文件
        destFile.createNewFile()
    }

    destFile.withObjectOutputStream {
        it.writeObject(object)
    }
}


def  student = new Student(id: 1,name: "张三",age: 18,phone: "13971117777",sex: "男",address: "上海时浦东新区")
saveObject(student,"./20240103002.txt")

​ 下面代码是从文件中读取上面存的对象:

def readObject(String path){
    def object =null
    def file=new File(path)
    if(file==null || !file.exists()){
        return null
    }
    file.withObjectInputStream {
        object=it.readObject()
    }
    return object
}

def s2=(Student)readObject("./20240103002.txt")
println(s2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/288373.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

word中设置上标后括号和数字没有上下对齐,解决

问题 word中设置上标后括号和数字没有上下对齐&#xff0c;如下图 原因 因为数字的括号是中文状态下输入的&#xff0c;数字是英文状态。用户需要将其改变成用英文状态下输入 解决办法 统一成英文状态&#xff1a;选中&#xff0c;设置字体为“半角” 如果上标来自参考文献…

计算机网络期末复习——计算大题(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

vue2 jeecg-boot

业务介绍 &#xff1a; 在首页进行数据的添加&#xff0c;添加之后 将数据传递给后端&#xff0c;后端会计算&#xff0c;在返回给前端&#xff0c;前端拿到进行渲染&#xff0c;拿到数据跳转到结果页面&#xff0c;点击存档后&#xff0c;才可以触发下载和浏览&#xff0c;不…

如何自动生成 API 接口文档 - 一份详细指南

本篇文章详细教你如何使用 Apifox 的 IDEA 插件实现自动生成接口代码。好处简单总结有以下几点&#xff1a; 自动生成接口文档&#xff1a; 不用手写&#xff0c;一键点击就可以自动生成文档&#xff0c;当有更新时&#xff0c;点击一下就可以自动同步接口文档&#xff1b;代码…

Apipost多Host服务配置

最近Apipost新增同环境下多host服务的配置功能&#xff0c;本篇文章带来该功能的使用场景及使用方法。 配置方法&#xff1a; 点击右上角眼睛标识进入环境管理 点击添加服务&#xff0c;输入服务名和URL 配置完成后需要在接口目录中选择该目录下需要使用的host服务&#xff0…

Linux——进程初识(二)

1. 对当前目录创建文件的理解 我们知道在创建一个文件时&#xff0c;它会被默认创建到当前目录下&#xff0c;那么它是如何知道当前目录的呢&#xff1f; 对于下面这样一段代码 #include <stdio.h> #include <unistd.h>int main() {fopen("tmp.txt", …

C++大作业——学生选课系统优化版

C大作业——学生选课系统优化版 前言1.学生类和课程类的实现2.输入输出流重载的实现3.增删改查的实现4.多级菜单的实现5.选课和退选的实现5.完整代码 前言 本文是对本人之前写过的一个学生选课系统的优化&#xff0c;整体上的逻辑是和我上一篇博客一样的&#xff08;链接在此&a…

这次,数据泄露的目标受害者指向了---救护车服务公司

已停业的救护车服务遭到勒索软件攻击导致近百万人受到威胁&#xff01; 此次数据泄露的目标受害者是法伦救护车服务公司&#xff0c;该公司是Transformative Healthcare的子公司。ALPHV勒索软件团伙声称对2023年4月下旬对Transformative Healthcare的攻击负责&#xff0c;并导…

3dmax全景图用什么渲染 全景图云渲染使用教程

在给客户展示设计概念时&#xff0c;应用3ds Max创建的全景图是一个高效直观的方法。这种方式不仅可以全方位地呈现整个空间&#xff0c;让客户沉浸式地感受设计师的创意&#xff0c;而且在展现大型空间设计&#xff0c;如展览馆或者会议室等&#xff0c;效果尤其显著&#xff…

如何在anaconda里安装basemap和pyproj库

当直接使用conda命令进行安装basemap和pyproj库时&#xff0c;会出现版本不对应的报错问题(如下图)&#xff0c;所以此篇博客用以展示如何安装basemap和pyproj库 题主默认使用的anaconda源已经切换成了清华大学源&#xff0c;但是仍然会出现报错&#xff0c;所以不是源的问题&a…

什么是向量数据库

什么是向量数据库 向量数据库是一种应用在高效存储和查询高维向量的数据库。在传统的OLTP和OLAP数据库中&#xff08;如上图所示&#xff09;&#xff0c;数据按行和列组织&#xff08;这些称为表&#xff09;&#xff0c;并根据这些列中的值执行查询。然而&#xff0c;在某些应…

ASP.NET Core AOT

Native AOT 最初在 .NET 7 中引入&#xff0c;在即将发布的 .NET 8 版本中可以与 ASP.NET Core 一起使用。在这篇文章中&#xff0c;我们从总体角度审视其优点和缺点&#xff0c;并进行测量以量化不同平台上的改进。 源代码&#xff1a;https://download.csdn.net/download/he…

华清远见作业第二十天——IO(第三天)

思维导图&#xff1a; 使用标准IO完成两个文件的拷贝 代码&#xff1a; #include<stdio.h> #include<string.h> #include<stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main(int argc, const char *…

SQL Server注入之攻防技战法

那天下着很大的雨&#xff0c;母亲从城里走回来的时候&#xff0c;浑身就是一个泥人&#xff0c;那一刻我就知道我没有别的选择了 1.Mssql报错注入 0.判断数据库类型 1.爆当前用户名 2.爆版本 3.爆服务器名 4.判断数据库个数 5.获取全部数据库 语句只适合>2005 爆当前数据…

桶式移位器

前言 本篇文章介绍CPU的核心部件之一&#xff1a;桶式移位器&#xff0c;简称BS&#xff0c;英文全称为Barrel Shifter 桶式移位器最大的特点就是能在单周期内完成多种方式&#xff0c;各种位数的移位操作 常见的移位操作 常见的移位操作种类如下&#xff1a; 算术右移 是指…

google-java-format 配置及应用

以google 的java 风格为基准&#xff0c;以后面的开发中&#xff0c;都需要满足这个&#xff0c;主要用到的是google的两个插件&#xff1a;google-java-format, google_checks.xml代码格式检测&#xff0c;这两个堪称双剑合并&#xff0c;代码成诗。google-java-format替换ide…

RS485数据采集模块,如何一次采集多个modbus设备数据?

在工业数据采集中&#xff0c;RS485是一种常见的数据通信协议&#xff0c;而Modbus则是其上的常用设备协议。那么&#xff0c;如何用一个模块高效采集多个Modbus设备的数据呢&#xff1f;这就是我们今天要探讨的话题&#xff01; 什么是RS485数据采集模块&#xff1f; 首先&a…

算法28:力扣64题,最小路径和------------样本模型

题目&#xff1a; 给定一个二维数组matrix&#xff0c;一个人必须从左上角出发&#xff0c;最后到达右下角 。沿途只可以向下或者向右走&#xff0c;沿途的数字都累加就是距离累加和 * 返回累加和最小值 思路&#xff1a; 1. 既然是给定二维数组matrix&#xff0c;那么二维数…

FreeRTOS——队列及其实战

1.队列概念 1&#xff09;队列是任务到任务、任务到中断、中断到任务数据交流的一种机制&#xff08;消息传递&#xff09; 2&#xff09;队列类似数组&#xff0c;只能存储有限数量、相同类型的数据&#xff0c;在创建时需指定队列长度与队列项大小 3&#xff09;出队入队阻塞…

xshell登录不上虚拟机了

电脑重启后连不上本地虚机了 1、关闭防火墙 2 虚拟机ping得到主机&#xff0c;而主机ping不到虚拟机的解决办法 原因&#xff1a;可能是主机的网络适配器没有调好 首先&#xff0c;找到虚拟机的网络配置器 根据虚拟机的IP信息修改主机虚拟适配器VMnet8 修改ip使得和虚拟机连…