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

news2024/9/19 21:03:48

文章目录

      • 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.coloradmin.cn/o/1354741.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨年烟花-Html5实现_附完整源码【可直接运行】

文章目录 &#x1f37b;前言&#x1f538;目录结构⚫完整源码&#x1f535;源码分析&#x1f4ae;注意事项 &#x1f488;总结 &#x1f37b;前言 随着科技的进步和互联网的普及&#xff0c;人们对于跨年庆祝的方式也在不断变化。传统的烟花燃放虽然美丽&#xff0c;但存在环境…

气泵方案|车载充气泵的芯片和传感器

无线车载充气泵方案由一块PCBA板集成其所需的功能&#xff0c;其充气原理是发动机通过两根三角带驱动气泵曲轴&#xff0c;进而驱动活塞进行打气&#xff0c;打出的气体通过导气管导入储气筒。另一方面储气筒又通过一根导气管将储气筒内的气体导入固定在气泵上的调压阀内&#…

实战环境搭建-安装xshell和xftp

安装xshell和xftp的原因是想远程虚拟机&#xff0c;很多时候&#xff0c;直接去操作虚拟机明显不太方便。 所以&#xff0c;我们需要一个能够搭载虚拟机和本地电脑之间的桥梁&#xff0c;哪怕是你们去了企业&#xff0c;也和这个类似&#xff0c;唯一的区别是企业里面更多连接…

postman设置下载文件大小限制

问题 本地写了一个下载文件的接口&#xff0c;调用postman测试的时候&#xff0c;小文件可以&#xff0c;但时大文件就会报错&#xff0c;postman提示&#xff1a; 解决方案 点击postman的设置按钮&#xff0c;点击【Settings】&#xff0c;在打开的弹窗中选择【General】Tab…

百度Apollo:自动驾驶的领航者

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 粉丝福利活动 ✅参与方式&#xff1a;通过连接报名观看课程&#xff0c;即可免费获取精美周边 ⛳️活动链接&#xf…

为什么避免在生命周期钩子中使用箭头函数

在Vue.js中&#xff0c;生命周期钩子是特殊的函数&#xff0c;它们在组件的不同阶段自动被调用。当这些钩子被调用时&#xff0c;Vue确保它们的this上下文指向当前组件的实例。这意味着在生命周期钩子内部&#xff0c;你可以通过this访问组件的数据、计算属性、方法等。这是Vue…

c语言:求最小公倍数|练习题

一、题目 输入两个数&#xff0c;求两数的最小公倍数。 如图&#xff1a; 二、思路分析 1、先知道两个数里的最小值(比如&#xff1a;9和6&#xff0c;取6) 2、用2到6&#xff0c;5个数&#xff0c;同时除以9和6,得最小公约数&#xff1a;3 3、用9除33&#xff0c;6除32。得最小…

全屏字幕滚动APP:12月份广告总收:84.89元(2023年12月份) 穿山甲SDK接入收益·android广告接入·app变现·广告千展收益·eCPM收益

接入穿山甲SDK app示例&#xff1a; android 数独小游戏 经典数独休闲益智 广告接入示例: Android 个人开发者如何接入广告SDK&#xff0c;实现app流量变现 2023年12月份&#xff0c;总新增用户1242 友盟统计&#xff1a; 12月份&#xff1a;总新增用户1242 2023年12月份…

maven:在maven中使用tomcat7插件

1、在pom.xml中添加tomcat7插件 <build><!-- Embedded Apache Tomcat required for testing war --><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</ver…

V8R6小版本升级步骤(单机环境)

在KingbaseES V8R6版本提供了sys_upgrade的升级工具。 sys_upgade介绍 sys_upgrade实现KingbaseES服务器实例版本升级。 sys_upgrade 允许将存储在KingbaseES数据文件中的数据升级到一个更高的KingbaseES主版本&#xff0c;而无需进行主版本升级(例如从 V8R6C4 到 V8R6C5)通…

【JUC】Synchronized及JVM底层原理

Synchronized使用方式 Synchronized有三种应用方式 作用于实例方法&#xff0c;当前示实例加锁进入同步代码前要获得当前实例的锁&#xff0c;即synchronized普通同步方法&#xff0c;调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否被设置。 如果设置了&#xff0c;执行…

Spring相关重点API

一&#xff1a;ApplicationContext的继承体系 ApplicationContext:接口类型&#xff0c;代表应用上下文&#xff0c;可以通过其实例获得Spring容器中的Bean对象 二&#xff1a;ApplicationContext的实现类 1&#xff1a;ClassPathXmlApplicationContext 它是从类的根路径下…

【无标题】idea的lombok插件支持@SuperBuilder注解啦

在我的博客阅读本文 1. 前言 今早进公司打开idea&#xff0c;弹出更新提示&#xff0c;简单看了下&#xff0c;原来是idea的lombok插件更新了&#xff0c;惊喜的发现update log上写着Add support for SuperBuilder。 为什么说是惊喜呢&#xff1f;因为之前也有用到这个的场景…

DIY 云成本优化的5大挑战

外星人。 黑暗骑士。 帝国反击战。 在 Incredibuild&#xff0c;如果有一样东西我们喜欢&#xff0c;那就是我们的话题永远有续集。我们将针对云端优化推出一个更深入的续集&#xff0c; 但这一次我们谈论的是云成本优化&#xff0c;采用 DIY 的方式。&#xff08;如果你还不…

Kubernetes Gateway API V1.0:您应该切换吗?

自Kubernetes Gateway API 发布 v1.0以来已经过去两个多月了&#xff0c;这标志着其一些关键 API 已经进入普遍可用状态。 去年&#xff0c;当网关 API升级为测试版时&#xff0c;我曾写过有关该 API的文章&#xff0c;但一年后&#xff0c;问题仍然存在。您是否应该从 Ingres…

SV-DJS-I13 深圳锐科达电梯 IP 五方对讲规格书

SV-DJS-I13 深圳锐科达电梯 IP 五方对讲规格书 DJS-I13 是专门对行业用户需求研发的一款 SIP 电梯五方对讲。它不仅有稳定性 好、电信级音质的优点&#xff0c;且完美兼容当下所有基于 SIP 的主流 IPPBX/软交换/IMS 平台, 如 Asterisk, Broadsoft, 3CX, Elastix 等。它集…

【MySQL用户管理】

目录&#xff1a; 前言用户管理创建用户删除用户修改用户密码修改用户密码安全检测设置 用户权限添加权限回收权限 总结 前言 剑指offer&#xff1a;一年又13天 用户管理 mysql> show databases; -------------------- | Database | -------------------- | inf…

[Python进阶] Python处理txt文件:open

7.1 Python处理txt文件&#xff1a;open 在Python中&#xff0c;通过open函数可以打开一个文件&#xff0c;创建一个file对象&#xff0c;然后对该对象进行读写。 函数语法&#xff1a; open(name[, mode[, buffering]…]) 参数说明&#xff1a; name&#xff1a;文件名 mode&…

你真的知道2024程序员搞钱新姿势吗?

2023年已经过去&#xff0c;2024的序曲已经奏响&#xff01;回顾2023&#xff0c;我们经历了降薪裁员的大趋势&#xff0c;身为程序员也有点惶惶不可终日&#xff0c;害怕会失去工作&#xff0c;害怕面对家人无奈的模样&#xff0c;害怕跟不上时代的步伐&#xff0c;沦为被大环…

Minitab 各版本安装指南

Minitab下载链接 https://pan.baidu.com/s/1PLqocknkoRGGI9lbV3e45A?pwd0531 1.鼠标右击【Minitab 21(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;选择【解压到 Minitab 21(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【setu…